auto_ptr和unique_ptr用法学习
转自: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;
}