auto_ptr
是 C++98 中引入的智能指针,用于自动管理动态分配的对象的生命周期。然而,它在 C++11 中已被标记为已废弃,并且在 C++17 中已被移除,因为它存在一些严重的缺陷和安全问题。
- auto_ptr 用法 {#title-0} =========================
我们先了解下 auto_ptr 智能指针创建、以及相关成员方法的作用。
#if 0
#include <iostream>
#include <vector>
using namespace std;
class Person
{
public:
Person()
{
cout << "Person 构造函数" << endl;
}
~Person()
{
cout << "Person 析构函数" << endl;
}
};
void test()
{
auto_ptr<Person> ptr(new Person);
// auto_ptr 不适合用于管理动态内存的数组对象。
//auto_ptr<Person[]> ptr(new Person[10]);
// 获得资源指针
cout << ptr.get() << endl;
// 释放资源所有权,即:ptr 不再持有动态资源
Person* p = ptr.release();
// 释放资源,并指向新的资源
ptr.reset(new Person);
// 只释放资源
ptr.reset();
}
int main()
{
test();
return 0;
}
#endif
- auto_ptr 缺陷 {#title-1} =========================
auto_ptr
被移除的主要原因是它存在一些严重的缺陷:
- 没有共享所有权 :
auto_ptr
不能共享所有权,这意味着多个指针不能指向同一个对象 - 不支持拷贝语义 :
auto_ptr
在拷贝或者赋值时进行的是资源所有权转移,而并不是真正的拷贝和赋值
#if 1
#include <iostream>
#include <vector>
using namespace std;
class Person
{
public:
Person()
{
cout << "Person 构造函数" << endl;
}
~Person()
{
cout << "Person 析构函数" << endl;
}
};
// 1. 不能共享所有权
void function(auto_ptr<Person> person) {}
void test01()
{
auto_ptr<Person> ptr1(new Person);
// 将 ptr1 传递到 ptr2 的有参构造中进行初始化
auto_ptr<Person> ptr2 = ptr1;
cout << "ptr1:" << ptr1.get() << " ptr2:" << ptr2.get() << endl;
// 赋值发生所有权转移
auto_ptr<Person> ptr3;
ptr3 = ptr2;
cout << "ptr2:" << ptr2.get() << " ptr3:" << ptr3.get() << endl;
function(ptr3);
cout << "ptr3:" << ptr3.get() << endl;
}
// 2. 不能作为容器元素
void test02()
{
auto_ptr<Person> ptr1(new Person);
auto_ptr<Person> ptr2(new Person);
// 容器要求元素要能够被拷贝
vector<auto_ptr<Person>> vec;
// 左值
// vec.push_back(ptr1);
// vec.push_back(ptr2);
// 添加右值(临时对象)
vec.push_back(auto_ptr<Person>(new Person));
auto v = vec[0];
cout << vec[0].get() << endl;
}
int main()
{
// test01();
test02();
return 0;
}
#endif