new指针赋值给shared_ptr ,和make_shard 有什么区别
时间: 2023-12-23 13:03:03 浏览: 79
将 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 对象是一种更好的选择。
相关问题
7. 关于shared_ptr的说法,错误的是:(10分) A.使用make_shared代替new生成shared_ptr B.shared_ptr可以用于管理单一对象的智能指针。 C.同一个对象的指针,可以shared_ptr和原生指针混用。 D.对于返回自身的shared_ptr指针的对象,要从enable shared from this类派生
C.同一个对象的指针,可以shared_ptr和原生指针混用。
这个说法是错误的。在使用shared_ptr时,应该避免将原生指针和shared_ptr混用,因为这可能导致资源管理的错误和潜在的内存泄漏。应该始终使用shared_ptr来管理资源的生命周期,避免手动释放资源。同时,为了避免循环引用导致的内存泄漏,当一个对象需要返回自身的shared_ptr指针时,应该从enable_shared_from_this类派生。
普通指针赋值shared_ptr
将普通指针转换为`std::shared_ptr`通常是为了在智能指针的生命周期管理下共享内存资源。当你有一个原始指针(raw pointer),你可以这样做:
```cpp
// 假设有个普通指针ptr
void* ptr = ...; // 获取到指向某个对象的地址
// 将普通指针转换为shared_ptr
std::shared_ptr<void> sharedPtr(ptr, std::default_delete<void>()); // 使用默认删除函数
```
这里的关键是传递一个`std::default_delete<T>`作为第二个模板参数,它表示当`shared_ptr`不再引用该对象时,如何安全地释放资源。对于非动态分配的对象,通常不需要自定义删除函数。
如果你需要传递对象的析构函数,可以这样做:
```cpp
class MyClass {
public:
~MyClass() { /*...*/ } // 类的析构函数
};
std::shared_ptr<MyClass> sharedPtr(new MyClass(), &MyClass::~MyClass);
```
这会确保当`sharedPtr`不再引用对象时,`MyClass`的析构函数会被正确调用。
阅读全文