auto_ptr 是C++98定义的智能指针模板,其定义了管理指针的对象,可以将new获得(直接或间接)的地址赋给这种对象.当对象过期时,其析构函数将使用delete来释放内存!
用法:
头文件: #include<memory>
用法: auto_ptr <类型> 变量名(new 类型);
#include<iostream>
#include<memory>
using namespace std;
class test {
public:
test() {
cout << "调用构造函数" << endl;
}
~test() {
cout << "调用析构函数" << endl;
}
};
int main(void) {
// 语法:
// auto_ptr<类型> 变量名(new 类型);
//test* t = new test();//普通用法 不能自己析构
auto_ptr<test>t(new test());
return 0;
}
运行结果:
get : 获取指针
// get : 获取指针
cout << t.get() << endl;
test* temp = t.get();
release : 取消智能指针对动态内存的托管,此时内存必须由程序员手动释放
auto_ptr<test>t(new test());
// release : 取消智能指针对动态内存的托管,此时内存必须由程序员手动释放
test* temp = t.release();
delete temp;
reset : 重置智能指针托管的动态内存,如果地址不一致,原来的地址会被释放
(1)无参 :释放当前对象
//test* t = new test();//普通用法 不能自己析构
auto_ptr<test>t(new test());
// reset : 重置智能指针托管的动态内存,如果地址不一致,原来的地址会被释放
t.reset();
结果:
(2)有参:释放原来的对象,重新托管新的对象
auto_ptr<test>t(new test());
// reset : 重置智能指针托管的动态内存,如果地址不一致,原来的地址会被释放
//t.reset();
t.reset(new test());
结果:
使用建议:
(1).尽可能不要将auto_ptr变量定义为全局变量或指针
(2).除非自己知道后果,不要把auto_ptr 智能指针赋值给同类型的另外一个智能指针
(3).C++11 后auto_ptr已经被"抛弃",已使用unique_ptr代替!
auto_ptr 被C++11抛弃的主要原因:
//auto_ptr 被C++11抛弃的主要原因:
auto_ptr<string>s1(new string("ABC"));
auto_ptr<string>s2(new string("abc"));
cout << "s1: " << s1.get() << endl;
cout << "s2: " << s2.get() << endl;
cout << "s1=s2" << endl;
s1 = s2;
cout << "s1: " << s1.get() << endl;
cout << "s2: " << s2.get() << endl;
将智能指针s2赋值给s1,首先s1会释放,将s2赋值给s1,同时也会s2释放
结果:
auto_ptr陷阱,不能将同一段内存交给多个智能指针同时管理!!!(适用于所有智能指针)
//auto_ptr陷阱,不能将同一段内存交给多个智能指针同时管理
string* s = new string("智能指针的内存管理陷阱");
{
auto_ptr<string>s2;
s2.reset(s);
{
auto_ptr<string>s1;
s1.reset(s);
cout << "s: " << *s1 << endl;
}
cout << "s: " << *s2 << endl;
}