new指针赋值给shared_ptr ,和make_shard 有什么区别
时间: 2023-12-23 22:03:03 浏览: 21
将 new 分配的指针赋值给 shared_ptr 会使得该指针被 shared_ptr 接管管理,但是需要手动管理资源的释放,容易出现内存泄漏,因此不是一个好的选择。
而使用 std::make_shared 创建 shared_ptr 对象,则可以避免手动管理资源释放,因为 std::make_shared 在创建 shared_ptr 对象时,会同时分配对象和控制块(用于跟踪对象的引用计数),这样可以确保对象的生命周期与 shared_ptr 一致,从而避免内存泄漏的问题。此外,std::make_shared 还可以提高内存的利用效率,因为它可以将对象和控制块一次性分配在连续的内存区域中,从而减少内存碎片和内存分配的次数。
综上所述,使用 std::make_shared 创建 shared_ptr 对象是一种更好的选择。
相关问题
shared_ptr和make_shared区别
shared_ptr和make_shared是C++中用于管理动态分配对象的智能指针。
1. shared_ptr:
- shared_ptr是一个类模板,用于管理动态分配对象的引用计数。
- shared_ptr可以指向任意动态分配的对象,并且可以共享所有权。
- 通过复制shared_ptr,引用计数会增加,当引用计数为0时,会自动释放关联的对象。
- shared_ptr需要额外的内存来存储引用计数,可能会导致一定的空间开销。
2. make_shared:
- make_shared是一个函数模板,用于直接创建并初始化shared_ptr。
- make_shared可以通过传递参数来创建对象,并将返回的shared_ptr指向该对象。
- make_shared在内存中一次性分配了用于存储对象和引用计数的内存块,可以减少空间开销。
- make_shared可以避免了显式使用new操作符来分配内存。
区别:
- 内存分配方式:shared_ptr使用单独的内存块存储引用计数,而make_shared在同一内存块中同时存储对象和引用计数。
- 性能和空间开销:make_shared通常比shared_ptr更高效,因为它只需要一次内存分配,并且可以减少空间开销。
- 使用场景:一般情况下,推荐使用make_shared,除非有特殊需求,如自定义内存分配器或需要显式控制资源释放的情况下,才使用shared_ptr。
shared_ptr和unique_ptr有什么区别?
shared_ptr和unique_ptr是C++中的智能指针,它们都用于管理动态分配的内存,但有一些区别。
1. 所有权:shared_ptr允许多个智能指针共享同一块内存资源,而unique_ptr则独占所指向的对象。当最后一个shared_ptr离开作用域时,它会自动释放内存;而unique_ptr在离开作用域时会自动删除所指向的对象。
2. 拷贝和赋值:shared_ptr可以通过拷贝和赋值操作创建新的智能指针,每个智能指针都会增加内部引用计数。而unique_ptr不允许拷贝,只能通过移动语义进行转移所有权。
3. 内存管理:shared_ptr使用引用计数来管理内存,每个智能指针都维护一个计数器,记录有多少个智能指针指向同一块内存。而unique_ptr没有引用计数,只有一个指针指向内存。
4. 大小:shared_ptr通常比unique_ptr更大,因为它需要额外的空间来存储引用计数。而unique_ptr只需要存储一个指针。
5. 自定义删除器:shared_ptr允许指定自定义的删除器函数来释放资源,而unique_ptr也支持自定义删除器,但是通常使用lambda表达式或函数对象来实现。