shared_ptr 和 make_shared 简介

shared_ptr函数简介

std::shared_ptr是C++标准库中的一个智能指针类型,它用于自动管理动态分配对象的生命周期,以防止内存泄漏。

基本概念:shared_ptr是一种智能指针,它跟踪指向的对象的引用计数。每当一个新的shared_ptr指向同一个对象时,引用计数增加;每当一个shared_ptr被销毁或重置时,引用计数减少。当引用计数减少到0时,shared_ptr会自动删除对象并释放内存。

初始化:可以使用std::make_shared函数或shared_ptr的构造函数来初始化一个shared_ptr。
例如:

std::shared_ptr<int> ptr1 = std::make_shared<int>(42);  
std::shared_ptr<MyClass> ptr2(new MyClass());

引用计数:shared_ptr通过内部使用一个控制块来维护引用计数。这个控制块存储了引用计数、删除器和指向对象的指针。
每当一个新的shared_ptr与另一个shared_ptr共享对象时,引用计数会增加。

拷贝和赋值:当一个shared_ptr被拷贝或赋值给另一个shared_ptr时,它们将共享同一个对象,并且引用计数会增加。例如:

std::shared_ptr<MyClass> ptr3 = ptr2; // 引用计数增加

线程安全:std::shared_ptr的引用计数操作是线程安全的,这意味着多个线程可以同时操作同一个shared_ptr对象而不会导致数据竞争。
但是,对shared_ptr所指向的对象的访问仍然需要适当的同步机制。
性能考虑:由于shared_ptr维护了引用计数和控制块,因此它比原生指针和一些其他智能指针类型(如std::unique_ptr)有一些额外的开销。这在某些性能关键的应用场景中可能是个问题,需要权衡使用。
注意事项:不要将裸指针与shared_ptr混合使用,因为这可能导致悬挂指针或重复删除同一个对象。此外,避免在构造函数和析构函数中直接使用裸指针操作,因为这可能绕过shared_ptr的生命周期管理。
总的来说,std::shared_ptr是一种非常有用的工具,可以帮助开发人员自动管理动态分配的内存并防止内存泄漏。但是,像所有工具一样,它也有其局限性和适用场景,需要根据具体情况谨慎使用。

make_shared 简介

std::make_shared是C++标准库中的一个函数,用于创建一个std::shared_ptr智能指针,并分配对象。
这个函数是C++11引入的,用于改进shared_ptr的初始化过程,并提供一种更为高效的方式来创建智能指针。

函数的基本形式如下:

template< class T, class... Args >  
shared_ptr<T> make_shared( Args&&... args );
其中,T是要创建的对象的类型,args是传递给T构造函数的参数列表。

使用std::make_shared的好处包括:

单一分配:make_shared在堆上同时分配对象和控制块,这只需要一次内存分配操作。
相比之下,使用shared_ptr的构造函数和new操作符则需要两次分配操作(一次用于对象,一次用于控制块)。因此,make_shared通常更高效。
类型安全:使用make_shared可以避免原始指针和智能指针之间的转换,从而提高类型安全。
异常安全:由于make_shared是单一分配,如果对象的构造函数抛出异常,那么不会泄漏内存。
使用示例:

#include <memory> // for std::shared_ptr, std::make_shared

struct MyClass {  
int value;  
MyClass(int v) : value(v) {}  
};

int main() {  
auto ptr = std::make_shared<MyClass>(42); // 创建一个 shared_ptr,指向一个值为42的 MyClass 对象  
return 0;  
}

在这个例子中,std::make_shared(42)创建了一个类型为MyClass的对象,
并使用值42初始化它。这个函数调用返回一个指向新创建的对象的std::shared_ptr智能指针。当这个智能指针离开其作用域或被重置时,它所指向的对象会被自动删除。

个人水平有限,有问题随时联系~

相关推荐

  1. 【WebGPU】简介开始

    2023-12-13 07:44:02       31 阅读
  2. GIT使用简介

    2023-12-13 07:44:02       28 阅读
  3. channel session 简介

    2023-12-13 07:44:02       14 阅读
  4. VimNano简介

    2023-12-13 07:44:02       12 阅读
  5. Redis简介数据类型

    2023-12-13 07:44:02       37 阅读
  6. PyTorchTensorFlow的简介

    2023-12-13 07:44:02       30 阅读

最近更新

  1. TCP协议是安全的吗?

    2023-12-13 07:44:02       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2023-12-13 07:44:02       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2023-12-13 07:44:02       18 阅读
  4. 通过文章id递归查询所有评论(xml)

    2023-12-13 07:44:02       20 阅读

热门阅读

  1. K8S的安装工具

    2023-12-13 07:44:02       39 阅读
  2. 第二百零三回 修改组件风格的另外一种方法

    2023-12-13 07:44:02       44 阅读
  3. EasyExcel

    2023-12-13 07:44:02       43 阅读
  4. msSQL和MySQL的区别?

    2023-12-13 07:44:02       51 阅读
  5. MySQL忘记root密码和修改root密码的解决方法

    2023-12-13 07:44:02       34 阅读
  6. 【解惑系列】如何提高一个接口的tps

    2023-12-13 07:44:02       37 阅读
  7. JVM类加载机制(中)

    2023-12-13 07:44:02       42 阅读