51工具盒子

依楼听风雨
笑看云卷云舒,淡观潮起潮落

C++ 智能指针 auto ptr

auto_ptr 是 C++98 中引入的智能指针,用于自动管理动态分配的对象的生命周期。然而,它在 C++11 中已被标记为已废弃,并且在 C++17 中已被移除,因为它存在一些严重的缺陷和安全问题。

  1. auto_ptr 用法 {#title-0} =========================

我们先了解下 auto_ptr 智能指针创建、以及相关成员方法的作用。

#if 0
#include <iostream>
#include <vector>
using namespace std;

class Person { public: Person() { cout << "Person 构造函数" << endl; }

~Person()
{
	cout &lt;&lt; &quot;Person 析构函数&quot; &lt;&lt; endl;
}

};

void test() { auto_ptr<Person> ptr(new Person); // auto_ptr 不适合用于管理动态内存的数组对象。 //auto_ptr<Person[]> ptr(new Person[10]);

// 获得资源指针
cout &lt;&lt; ptr.get() &lt;&lt; endl;

// 释放资源所有权,即:ptr 不再持有动态资源
Person* p = ptr.release();

// 释放资源,并指向新的资源
ptr.reset(new Person);
// 只释放资源
ptr.reset();

}

int main() { test(); return 0; }

#endif

  1. auto_ptr 缺陷 {#title-1} =========================

auto_ptr 被移除的主要原因是它存在一些严重的缺陷:

  1. 没有共享所有权auto_ptr 不能共享所有权,这意味着多个指针不能指向同一个对象
  2. 不支持拷贝语义auto_ptr 在拷贝或者赋值时进行的是资源所有权转移,而并不是真正的拷贝和赋值
#if 1
#include <iostream>
#include <vector>
using namespace std;

class Person { public: Person() { cout << "Person 构造函数" << endl; }

~Person()
{
    cout &lt;&lt; &quot;Person 析构函数&quot; &lt;&lt; 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&lt;Person&gt; ptr3;
ptr3 = ptr2;
cout &lt;&lt; &quot;ptr2:&quot; &lt;&lt; ptr2.get() &lt;&lt; &quot; ptr3:&quot; &lt;&lt; ptr3.get() &lt;&lt; endl;

function(ptr3);
cout &lt;&lt; &quot;ptr3:&quot; &lt;&lt; ptr3.get() &lt;&lt; endl;

}

// 2. 不能作为容器元素 void test02() { auto_ptr<Person> ptr1(new Person); auto_ptr<Person> ptr2(new Person);

// 容器要求元素要能够被拷贝
vector&lt;auto_ptr&lt;Person&gt;&gt; vec;
// 左值
// vec.push_back(ptr1);
// vec.push_back(ptr2);

// 添加右值(临时对象)
vec.push_back(auto_ptr&lt;Person&gt;(new Person));
auto v = vec[0];
cout &lt;&lt; vec[0].get() &lt;&lt; endl;

}

int main() { // test01(); test02(); return 0; }

#endif

赞(3)
未经允许不得转载:工具盒子 » C++ 智能指针 auto ptr