-
不使用auto_ptr。
-
unique_ptr可以指向动态数组。因为unique_ptr有unique_ptr<T[]>重载版本,销毁动态对象时调用delete[]:
class A{ }; unique_ptr<A[]> unique_ap(new A[1]{ A()});
-
使用unique_ptr,当需要共享对象所有权时,依然可以将其转化为shared_ptr,但反过来则不行。
class A{ }; unique_ptr<A> a(new A("unique_ptr")); shared_ptr<A> b = move(a); //a = move(b); // 报错 //a.reset(b.get()); // 运行错误 cout<<a.get()<<endl;
-
使用shared_ptr需要消耗更多的资源,shared_ptr需要维护一个指向动态内存对象的线程安全的引用计数器以及背后的一个控制块,这使它比unique_ptr更加复杂。
-
共享对象所有权也许并非你的本意,但使用shared_ptr有可能造成其他程序员无意间通过赋值给另一个共享指针而修改了你共享出来的对象。
-
不要使用静态分配对象的指针初始化智能指针,否则,当智能指针本身被撤销时,它将试图删除指向非动态分配对象的指针,导致未定义的行为。
A a();//全局变量 int main() { A b();//局部变量 //unique_ptr<A> pa(&a); // 运行错误 //unique_ptr<A> pa(&b); // 析构两次 }
-
unique_ptr可以作为函数返回值。
尽管unique_ptr无拷贝语义,但提供了移动语义,所以可作为函数返回值。
class
C++ 智能指针使用注意事项
最新推荐文章于 2022-05-07 11:43:13 发布
本文讨论了C++智能指针的使用注意事项,包括避免使用auto_ptr,使用unique_ptr管理动态数组,理解unique_ptr与shared_ptr的转换限制,谨慎使用get和release方法,避免静态分配对象初始化智能指针,以及在对象内部正确使用shared_from_this。同时强调了使用make函数初始化智能指针的效率和异常安全性,以及避免共享对象循环引用和类型转换错误。
摘要由CSDN通过智能技术生成