c++智能指针介绍之auto_ptr

c++智能指针介绍之auto_ptr


  • c++98: auto_ptr, 包含头文件为里, c++11 弃用,unique_ptr代之

auto_ptr

作用及特性:

  1. 智能指针的引用,主要是为了解决异常发生时产生内存泄漏。
  2. auto_ptr在创建的时候获取对象的所有权,在析构的时候,释放对象内存空间(RAII1)。
  3. 重载了函数的 *->运算符,使得其操作看起来像个内置指针。
  4. 没有使用引用计数,在复制构造或赋值的时候发生所有权转移

包含的操作:

  1. 拷贝构造、赋值操作:
auto_ptr(auto_ptr& __a) throw() : _M_ptr(__a.release()) { }
 auto_ptr& operator=(auto_ptr& __a) throw()
{
	reset(__a.release());
	return *this;
}
  1. reset/release/get
void reset(element_type* __p = 0) throw()
{
	if (__p != _M_ptr) {  // 防止自身赋值
		delete _M_ptr; // 删除原来的内容
		_M_ptr = __p; 
	}
}

element_type* release() throw()
{
	element_type* __tmp = _M_ptr;
	_M_ptr = 0; // 放弃原来的所有权
	return __tmp; // 将所有权返回
}

element_type* get() const throw() { return _M_ptr; }
  1. 构造/析构:构造函数是explicit的,不能隐式转换
explicit auto_ptr(element_type* __p = 0) throw() : _M_ptr(__p) { }
// int *p = new int(1);   auto_ptr ap = p;  错误,不能隐式转换
~auto_ptr() { delete _M_ptr; }

缺点:

  1. 删除方式,默认是delete,如果保存的指针指向的是数组,则应使用delete[]才能正确释放
int *arr = new int[100];
auto_ptr<int> ap(arr); // 析构函数中删除对象使用delete而不是delete[],所以auto_ptr不能用来管理数组指针
  1. 当对一个auto_ptr执行拷贝构造和赋值运算时,对象所有权被转移,再执行读写操作时会有问题;同时对于原始指针不能再做释放操作
int *p = new int(1);
auto_ptr<int> ap(p);
auto_ptr<int> ap2 = ap; 
*ap = 3; // 错误,对象所有权已经转移
  1. 不能讲auto_ptr对象存储在容器中,因为容器中的元素默认是支持拷贝、赋值操作的。
    vector > vx; // 错误,容器中保存auto_ptr实例是不被允许的
  2. 应该避免多个auto_ptr指向同一个原始指针,这样会重复析构
int *p = new int(1);
auto_ptr<int> ap1(p);
auto_ptr<int> ap2(p); // 析构的时候会重复delete p
  1. 不能保存静态类型,因为auto_ptr析构的时候释放内存,发生释放非动态申请到的内存情况。
    int a = 2; auto_ptr ap(&a); // ap析构是发生错误

备注:
1. auto_ptr能作为函数返回值吗?
可以, auto_ptr支持拷贝构造和赋值操作,函数返回时通常会发生拷贝构造操作。

auto_ptr<int> getAgeInt()
{
    int *age = new int(3);
    return auto_ptr<int>(age);
}

  1. Resource Acquisition is Initialization, 资源获取即初始化,也就是说,在控制资源生命周期的时候,在某个对象初始化(构造)的时候获取资源,而在对象销毁的时候析构。 ↩︎

你可能感兴趣的:(#,1.1,c++)