C++ 补充 & C++ 11 - C++智能指针auto_ptr 使用详解 (C++98)

auto_ptr 使用详解 (C++98)

auto_ptr 是c++ 98定义的智能指针模板,其定义了管理指针的对象,可以将new 获得(直接或间接)的地址赋给这种对象。当对象过期时,其析构函数将使用delete 来释放内存!

用法:
头文件: #include
用 法: auto_ptr<类型> 变量名(new 类型)


例 如:
auto_ptr str(new string(“我要成为大牛~ 变得很牛逼!”));
auto_ptr av(new vector(10));

demo 代码(一)

#include 
#include 
#include 
#include 

using namespace std;

// auto_ptrt(new Test()); /* 忠告1: 智能指针不要定义为全局变量 */

class Test
{
public:
	Test()
	{
		cout << "Test is construct" << endl;
		this->debug = 1;
	}
	
	int getDebug()
	{
		return debug;
	}

private:
	int debug;
};


/* 用法: auto_ptr<类型> 变量名(new 类型) */
void memory_leak_demo1()
{
	auto_ptr<Test>t(new Test());

	/* 忠告3: 除非自己知道后果, 不要把 auto_ptr 智能指针赋值给同类型的另外一个智能指针 */
	//auto_ptr t1;
	//t1 = t;

	auto_ptr<Test>* tp = new auto_ptr<Test>(new Test()); /* 忠告2: 不要定义指向智能指针对象的指针变量 */

	/* 在使用智能指针访问对象时, 使用方式和普通指针一样 */
	cout << "debug: " << t->getDebug() << endl;
	cout << "debug: " << (*t).getDebug() << endl;

	//Test* tmp = t.get();
	//cout << "get debug: " << tmp->getDebug() << endl;

	/* release 取消指针指针对动态内存的托管, 之前分配的内存必须手动释放 */
	//Test* tmp = t.release();
	//delete tmp;

	/* reset 重叠智能指针托管的内存地址, 如果地址不一致, 原来的会被析构调 */
	//t.reset();
	t.reset(new Test());

	if (0)
	{
		Test* t1 = new Test();
		t1->getDebug();
	}

	return;
}

int memory_leak_demo2()
{
	Test* t = new Test();
	auto_ptr<Test> t(new Test());

	/*****************************************
	* 程序执行一段复杂的逻辑, 假设尝试从一个必须存在
	* 的文件中读取某些数据, 而文件此时不存在
	******************************************/
	{
		throw exception("文件不存在");
	}

	//delete t;
	return 0;
}

int main()
{
	memory_leak_demo1();

	/*try
	{
		memory_leak_demo2();
	}
	catch (exception e)
	{
		cout << "catch exception: " << e.what() << endl;
	}*/

	system("pause");
	return 0;
}

使用建议:

  1. 尽可能不要将 auto_ptr 变量定义为全局变量或指针
  2. 除非自己知道后果, 不要把 auto_ptr 智能指针赋值给同类型的另外一个智能指针
  3. C++11 后 auto_ptr 已经被 “被抛弃”, 已使用 unique_ptr 代替!

结语:

时间: 2020-07-03

你可能感兴趣的:(C++,补充,&,C++11,指针,内存管理)