C++ Make_shared

2024 年 8 月 28 日 | 3 分钟阅读

在 C++ 中编写高效且可靠的代码需要仔细考虑内存管理问题。标准库提供的一个最有用的内存管理工具是 make_shared 函数。在这篇博文中,我们将研究 make_shared 函数、其 语法,以及它如何简化 C++ 程序中的内存分配和释放。为了演示其应用和优点,我们还将提供代码示例和结果。

C++ 标准库的 <memory> 头文件 包含 make_shared 函数。这个有用的工厂方法将对象的创建和内存分配结合到一个简单的过程中。您可以通过使用 make_shared 生成对象的共享指针,同时避免显式动态内存管理。

语法

make_shared 的用法如下:

其中,T 代表要 创建 的对象 类型,&args 是构造函数参数(如果有的话)。make_shared 函数 在为其动态分配的内存中创建 T 类型 的对象。

Make_shared 函数的优点

与传统的动态内存 分配显式构造 相比,使用 make_shared 具有以下各种 优点

  1. 效率:make_shared 在同一内存块中为共享指针管理控制块和对象分配内存。与 newshared_ptr 生成 进行的单独分配相比,这降低了内存开销并提高了性能。
  2. 通过在对象创建时抛出异常的情况下提供适当的清理,make_shared 提供了强大的异常安全性。在发生异常时自动释放对象的已分配内存,从而避免了 内存泄漏
  3. 提高可读性:make_shared 通过整合分配和构造来生成更简单、更易读的代码。由于不再需要单独的 new 和 shared_ptr 语句,因此资源泄漏的可能性较小。
  4. 减少开销和内存碎片:通过为对象和控制块创建单个块,make_shared 优化了内存使用。与单独的内存分配相比,它最大程度地减少了内存碎片。Make_shared 通过减少开销来提高 效率 并实现更有效的内存使用,尤其是在处理大量小对象时。
  5. 共享所有权和循环引用:在存在循环引用的情况下,使用 make_shared 甚至更有优势。当两个或多个对象相互共享指针时,称为 循环引用。所有连接的共享指针都具有相同的控制块,因为 make_shared 在同一块中为对象和控制块分配内存。循环引用不再构成内存泄漏风险,并且在所有共享指针都删除时确保了正确的释放。

示例

让我们看一个简单的例子,展示 make_shared 的用法和输出:

输出

Constructor called with value: 42
Shared pointer created!
Destructor called with value: 42

说明

此代码创建了一个名为 MyClass 的简单类,它有一个构造函数和析构函数。我们在主函数中使用 make_shared 建立一个共享指针 ptr,并将其构造函数赋值为 42。结果显示,当一个对象形成时,构造函数被调用,共享指针成功构造,并且当共享指针不再使用时,析构函数被调用。

结论

在 C++ 中,make_shared 函数是一种强大的内存管理技术。它简化了为对象分配内存和构建对象的过程,并且代码更简洁易读。它还提供效率和强大的异常安全性,防止内存泄漏。

在这篇博客中,我们讨论了 C++ make_shared 函数。我们讨论了它的优点、用法和语法。Make_shared 通过将内存分配和对象构造集成到一个操作中来提高 生产力、异常安全性代码可读性

每当您需要生成对象的共享指针时,请使用 make_shared。使用它可以大大简化您的内存管理职责,从而提高代码的健壮性和可维护性。