std::make_shared

std::make_shared 是 C++11 引入的一个标准库函数,用于创建一个 std::shared_ptr,并在堆上分配所需的对象。
它的功能是将对象的创建和 shared_ptr 的初始化合并在一起,提高了效率和安全性。

使用方法:

auto ptr = std::make_shared<T>(args...);
  • T: 共享指针所管理的对象的类型。
  • args...: 传递给 T 构造函数的参数。

特点:

  1. 高效std::make_shared 会在一次内存分配中同时为对象和引用计数器分配空间,减少了单独使用 newstd::shared_ptr 时可能需要的两次内存分配。
  2. 安全:减少了手动 new 对象带来的内存泄漏风险,不需要显式 delete,因为 shared_ptr 会自动管理对象的生命周期。
  3. 简洁:相比于直接使用 new,它使代码更加简洁明了。

例子:

#include <iostream>
#include <memory>

struct MyClass {
    int value;
    MyClass(int v) : value(v) {
        std::cout << "MyClass constructor\n";
    }
    ~MyClass() {
        std::cout << "MyClass destructor\n";
    }
};

int main() {
    // 使用 make_shared 创建 shared_ptr
    std::shared_ptr<MyClass> ptr = std::make_shared<MyClass>(42);

    std::cout << "Value: " << ptr->value << std::endl;
    return 0;
}

输出

MyClass constructor
Value: 42
MyClass destructor

优点:

  • 性能:减少了内存分配和释放次数,提升了性能。
  • 简洁:避免手动使用 newdelete,代码更加清晰易懂。
  • 安全:自动管理内存,避免内存泄漏。

new 的区别:

// 使用 new 和 shared_ptr
std::shared_ptr<T> ptr(new T(args...));

// 使用 make_shared
auto ptr = std::make_shared<T>(args...);

区别

  1. make_shared 在堆上分配对象和引用计数器时只进行一次内存分配,而 newshared_ptr 组合时是两次内存分配。
  2. make_shared 更加安全,因为 shared_ptr 的构造和对象的分配是一体的,避免了潜在的内存泄漏风险。

因此,std::make_shared 是推荐的方式,除非在特定场景下需要精细控制对象的构造或内存管理。****

posted @ 2024-10-07 11:54  牛马chen  阅读(129)  评论(0编辑  收藏  举报