转自:https://blog.csdn.net/cpp_learner/article/details/118912592,chatgpt
1.auto_ptr存在的问题
- 复制或者赋值都会改变资源的所有权;
auto_ptr
的设计有一些缺陷,特别是其所有权转移语义(transfer of ownership)。当一个auto_ptr
被赋值或拷贝时,所有权会从源对象转移到目标对象,这使得auto_ptr
在容器和算法中使用时容易出错。 - 不支持对象数组的内存管理;
2.unique_ptr介绍
- 基于排他所有权模式:两个指针不能指向同一个资源
- 无法进行左值unique_ptr复制构造,也无法进行左值复制赋值操作,但允许临时右值赋值构造和赋值
- 保存指向某个对象的指针,当它本身离开作用域时会自动释放它指向的对象。
- 在容器中保存指针是安全的。
{ unique_ptr<string> p1(new string("I'm Li Ming!")); unique_ptr<string> p2(new string("I'm age 22.")); cout << "p1:" << p1.get() << endl;// p1:0x192a070 cout << "p2:" << p2.get() << endl;// p2:0x192a0a0 // 报错: error: use of deleted function ‘std::unique_ptr,赋值运算符是delete的 // p1 = p2; // 禁止左值赋值 // 报错: use of deleted function ‘std::unique_ptr<_Tp, _Dp>::unique_ptr(const std::unique_ptr<_Tp, _Dp>&) // 拷贝构造函数也是=delete的 // unique_ptr<string> p3(p2); // 禁止左值赋值构造 unique_ptr<string> p3(std::move(p1)); p1 = std::move(p2); // 使用move把左值转成右值就可以赋值了,效果和auto_ptr赋值一样 cout << "p1 = p2 赋值后:" << endl; cout << "p1:" << p1.get() << endl; // p1:0x192a0a0 cout << "p2:" << p2.get() << endl; // p2:0 cout<< "p3: " << p3.get()<<endl;// p3:0x192a070 cout<<endl; }
标签:auto,move,左值,unique,ptr,赋值 From: https://www.cnblogs.com/BlueBlueSea/p/18203118