auto_ptr
是 C++98 中引入的智能指针,用于自动管理动态分配的对象的生命周期。然而,它在 C++11 中已被标记为已废弃,并且在 C++17 中已被移除,因为它存在一些严重的缺陷和安全问题。
1. auto_ptr 用法
我们先了解下 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
2. auto_ptr 缺陷
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