shared_ptr注意点

时间:2023-03-09 20:53:36
shared_ptr注意点

1.原始指针不能直接使用赋值运算符对shared_ptr进行赋值运算

std::shared_ptr<int> p;
p= new int(); //error
p.reset(new int(); //success

2.shared_ptr默认情况下不支持对数组内存的管理

std::shared_ptr<int> p(new int[],[](int *P){delete[] p;});
std::shared_ptr<int> p(new int[],std::default_delete<int[]>);
std::unique_ptr<int[]> arr(new int[]);
std::shared_ptr<int> p(std::move(arr));

in c++11,it is valid to construct a shared_ptr<T> from a std::unique_ptr<T[]>,since the shared_ptr obtains its deleter(a std::default_delete<T[]> object) from

the unique_ptr,the array will be correctly deallocated.

3.同一个原始指针不能初始化多个std::shared_ptr

int *integer_p= new int();
std::shared_ptr<int> p1(integer_p); //success
std::shared_ptr<int> p2(integer_p); //error

4.避免在传参时构建智能指针

可能智能指针还在构建时,就抛出异常。

std::unique_ptr 若不使用默认删除器,则需要指定删除器类型

std::unique_ptr<int,void(*)(int *)> p(new int (1),[](int *P){delete p;});