auto_ptr的使用

auto_ptr是许许多多智能指针中的一种,auto_ptr做这样一件事:拥有一个动态分配内存对象,并且在它不再需要的时候履行自动清理的职责。

下面上一些使用例子:

#include <stdio.h>
#include <iostream>
#include <memory>
#include <vector>
using namespace std;

class D
{
public:
	D() : d(1) {}
	~D() { printf("D destruction\n");  }
	int d;
};

void AutoUse()
{
	auto_ptr<D> auto_d(new D());
	printf("auto_d: %d\n", auto_d->d);
}

int _tmain(int argc, _TCHAR* argv[])
{
	AutoUse();
	getchar();
	return 0;
}

输出结果:

auto_d: 1
D destruction

观察输出结果我们发现,auto_d在离开作用域的时候把动态分配的对象析构掉了


#include <stdio.h>
#include <iostream>
#include <memory>
#include <vector>
using namespace std;

class D
{
public:
	D() : d(1) {}
	~D() { printf("D destruction\n");  }
	int d;
};

void AutoUse()
{
	auto_ptr<D> auto_d(new D());
	printf("auto_d: %d\n", auto_d->d);
	D* p = auto_d.release();
	if (p)
	{
		printf("p->d: %d\n", p->d);
	}
	delete p;
}

int _tmain(int argc, _TCHAR* argv[])
{
	AutoUse();
	getchar();
	return 0;
}
输出结果:

auto_d: 1
p->d: 1
D destruction

这个例子中,我们使用了release把动态分配的指针从auto_d中提取出来裸露使用,此时auto_d已经失去动态分配指针的所有权了,所以最后我们要自行删掉动态分配指针,不然会造成内存泄露


#include <stdio.h>
#include <iostream>
#include <memory>
#include <vector>
using namespace std;

class D
{
public:
	D() : d(1) {}
	~D() { printf("D destruction\n");  }
	int d;
};

void AutoUse()
{
	auto_ptr<D> auto_d(new D());
	printf("auto_d: %d\n", auto_d->d);
	auto_d.reset(new D());
}

int _tmain(int argc, _TCHAR* argv[])
{
	AutoUse();
	getchar();
	return 0;
}

运行结果:

auto_d: 1
D destruction
D destruction

使用reset会把auto_d原来关联的指针删除,然后再绑定新的指针到auto_d上去


#include <stdio.h>
#include <iostream>
#include <memory>
#include <vector>
using namespace std;

class D
{
public:
	D() : d(1) {}
	~D() { printf("D destruction\n");  }
	int d;
};

void AutoUse()
{
	auto_ptr<D> auto_d(new D());
	D* p = auto_d.get();
	printf("p->d: %d\n", p->d);
}

int _tmain(int argc, _TCHAR* argv[])
{
	AutoUse();
	getchar();
	return 0;
}

运行结果:

p->d: 1
D destruction

auto_ptr的get成员函数可以返回绑定的指针,但并不会解绑


#include <stdio.h>
#include <iostream>
#include <memory>
#include <vector>
using namespace std;

auto_ptr<D> RetAP()
{
	auto_ptr<D> auto_d(new D());
	return auto_d;
}

void AutoUse()
{
	auto_ptr<D> auto_d = RetAP();
	printf("auto_d->d: %d\n", auto_d->d);
}

int _tmain(int argc, _TCHAR* argv[])
{
	AutoUse();
	getchar();
	return 0;
}

运行结果:

auto_d->d: 1
D destruction

函数返回auto_ptr对象


推荐一篇十分详细的文章: http://www.cppblog.com/mymsdn/archive/2010/04/07/Using-auto_ptr-Effectively.html



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值