class MyException
{
public:
MyException();
MyException(int age);
MyException(const MyException& p);
~MyException();
int age;
private:
};
MyException::MyException()
{
printf("%s\n", __FUNCSIG__);
}
MyException::MyException(int age)
{
this->age = age;
printf("%s\n", __FUNCSIG__);
}
MyException::MyException(const MyException& p)
{
printf("%s\n", __FUNCSIG__);
}
MyException::~MyException()
{
printf("%s\n", __FUNCSIG__);
}
今天学习到一个智能指针,我从来么见过:auto_ptr
;
使用:
void test8() {
auto_ptr<MyException>p3(new MyException);
}
可以自动释放堆上的创建的出来的第三者对象
这么神奇?内存以后可以自动管理了?不用手动释放了?
其实不然,我又创建了一个在堆上的auto_ptr
。居然不会自动释放了。
void test7() {
auto_ptr<MyException>* p3 = new auto_ptr<MyException>(new MyException);
}
我内心大概知道auto_ptr
是怎么自动释放第三者内存了。其实就是内部就是一个指针指向了第三方的堆上的内存。
由于自己在栈上时,函数执行完时会自动调用析构函数,在析构函数调用delete 这个指针即可;
自己在堆上时,函数执行完时不会
自动调用析构函数,也就无法释放第三方堆上对象,除非你手动deleteauto_ptr
这个对象,这时就变得不那么智能了。
而且这个auto_ptr
不能智能取管理栈上的第三方对象。
void test9() {
MyException p1(10);
auto_ptr<MyException>p3(&p1);
}
因为p1在结束时会自动释放,轮到auto_ptr
释放时,其内部指针再去delete这快内存时就会崩溃
即使是C++11的unique_ptr
也存在同样的问题
看完这个分析之后,估计你也可以手写一个智能
指针了
网友评论