C++ 智能指针 auto ptr

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 被移除的主要原因是它存在一些严重的缺陷:

  1. 没有共享所有权auto_ptr 不能共享所有权,这意味着多个指针不能指向同一个对象
  2. 不支持拷贝语义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
未经允许不得转载:一亩三分地 » C++ 智能指针 auto ptr
评论 (0)

5 + 9 =