c++ auto_ptrs

Note:本类模板已废弃的C ++ 11。的unique_ptr是具有类似功能的新设施,但提高了安全性(无假货分配副本),附加功能(删除器)和阵列的支持。见的unique_ptr了解更多信息。
该类模板提供了指针有限的垃圾收集设施,允许指针有他们指出,当auto_ptr的对象本身销毁,自动销毁的元素。
auto_ptr的对象有服用分配给它们的指针所有权的特点:具有所有权超过一个元素是负责消灭它指向的元素,并释放内存分配给它自己时被摧毁一个auto_ptr对象。析构函数通过调用operator自动删除这一点。
因此,任何两个auto_ptr的对象应该拥有相同的元件,由于两个会试图在某些时候销毁它们。当分配操作需要两个auto_ptr的对象之间的地方,所有权转移,这意味着对象失去所有权被设置为不再指向所述元件(它被设置为空指针)。
ms-help://MS.MSDNQTR.v90.chs/dv_vcstdlib/html/bbf65bb9-7fd2-4466-bc53-30a9cb35ffcf.htm
http://www.cplusplus.com/reference/memory/auto_ptr/?kw=auto_ptr


#include <vector>
#include <iostream>
#include <memory>

using namespace std;



//构造函数  
void auto_ptrConstructor(void);

//该成员函数返回所存储的指针myptr
void auto_ptr_get();

//成员替换为空指针所存储的指针PTR,并返回先前存储的指针
void auto_ptr_release(void);

//成员函数计算表达式删除我的PTR,但只有当存储指针值PTR变化函数调用的结果。然后,它替换PTR所存储的指针
void auto_ptr_reset(void);


int main()
{
	//auto_ptrConstructor();
	//auto_ptr_get();
	//auto_ptr_release();
	auto_ptr_reset();
	return 0;
}

class Int
{
public:
	Int(int i)
	{
		cout << "Constructing " << (void*)this << endl;
		x = i;
		bIsConstructed = true;
	};
	~Int()
	{
		cout << "Destructing " << (void*)this << endl;
		bIsConstructed = false;
	};
	Int &operator++()
	{
		x++;
		return *this;
	};
	int x;
private:
	bool bIsConstructed;
};

void function(auto_ptr<Int> &pi)
{
	++(*pi);
	auto_ptr<Int> pi2(pi);
	++(*pi2);
	pi = pi2;
}

//构造函数  
void auto_ptrConstructor(void)
{
	auto_ptr<Int> pi(new Int(5));
	cout << pi->x << endl;
	function(pi);
	cout << pi->x << endl;

	return;
	/*
	Constructing 003CD438
	5
	7
	Destructing 003CD438
	请按任意键继续. . .
	*/

}


class IntGet
{
public:
	IntGet(int i)
	{
		x = i;
		cout << "Constructing " << (void*)this << " Value: " << x << endl;
	};
	~IntGet()
	{
		cout << "Destructing " << (void*)this << " Value: " << x << endl;
	};

	int x;

};



//该成员函数返回所存储的指针myptr
void auto_ptr_get()
{
	auto_ptr<IntGet> pi(new IntGet(5));
	pi.reset(new IntGet(6));
	IntGet* pi2 = pi.get();
	IntGet* pi3 = pi.release();
	if (pi2 == pi3)
		cout << "pi2 == pi3" << endl;
	delete pi3;


	return;
	/*
	Constructing 005DCD68 Value: 5
	Constructing 005DCD98 Value: 6
	Destructing 005DCD68 Value: 5
	pi2 == pi3
	Destructing 005DCD98 Value: 6
	请按任意键继续. . .
	*/
}

//成员替换为空指针所存储的指针PTR,并返回先前存储的指针
void auto_ptr_release(void)
{
	auto_ptr<IntGet> pi(new IntGet(5));
	pi.reset(new IntGet(6));
	IntGet* pi2 = pi.get();
	IntGet* pi3 = pi.release();
	if (pi2 == pi3)
		cout << "pi2 == pi3" << endl;
	delete pi3;


	return;
	/*
	Constructing 005DCD68 Value: 5
	Constructing 005DCD98 Value: 6
	Destructing 005DCD68 Value: 5
	pi2 == pi3
	Destructing 005DCD98 Value: 6
	请按任意键继续. . .
	*/
	return;
}

//成员函数计算表达式删除我的PTR,但只有当存储指针值PTR变化函数调用的结果。然后,它替换PTR所存储的指针
void auto_ptr_reset(void)
{
	auto_ptr<IntGet> pi(new IntGet(5));
	pi.reset(new IntGet(6));
	IntGet* pi2 = pi.get();
	IntGet* pi3 = pi.release();
	if (pi2 == pi3)
		cout << "pi2 == pi3" << endl;
	delete pi3;

	/*
	Constructing 002ECD68 Value: 5
	Constructing 002ECD98 Value: 6
	Destructing 002ECD68 Value: 5
	pi2 == pi3
	Destructing 002ECD98 Value: 6
	请按任意键继续. . .
	*/
	return;
}


你可能感兴趣的:(c++ auto_ptrs)