在编程中会分配动态内存,将内存地址赋给一个指针,利用指针来操控内存,并在不需要的时候利用delete释放。如果内存分配之后,还没有来得及释放内存就发生了异常,可能就会造成内存泄露。c++ 提供智能指针来解决之一问题。
auto_ptr的对象存在,它指向的字符串就存在,auto_ptr不存在,会自动销毁它指向的对象,从而避免了内存泄露。所以叫智能指针。
下面用一个程序来说明智能指针是如何使用的:
#include<iostream>
#include<memory>
using namespace std;
class Book
{
public:
Book(){cout<<"Book 构造函数执行...\n";}
~Book(){cout<<"Book 析构函数执行...\n";}
};
class X{};
bool quit = false;
void Out()
{
if(quit == true)
throw X();
}
void func()
{
auto_ptr<Book> p (new Book);
quit = true;
Out();
}
int main()
{
try
{
func();
}
catch(X)
{
cout<<"捕获到X异常,开始处理。\n";
}
return 0;
}
从执行的结果看,调用了Book的析构函数,释放了内存。
下面在上一个程序,继续了解智能指针的用法:
#include<iostream>
using std::cout;
using std::endl;
#include<memory>
using std::auto_ptr;
class Integer
{
public:
Integer(int i =0):value(i)
{
cout<<"constructor for integer: "<<value<<endl;
}
~Integer()
{
cout<<"Destrctor for integer "<<value<<endl;
}
void setInteger(int i)
{
value = i;
}
int getInteger() const
{
return value;
}
private:
int value;
};
int main()
{
cout<<"Creating an auto_ptr object that point to an "<<"Integer"<<endl;
auto_ptr<Integer>ptrToInteger(new Integer(7));
cout<<"Using the auto_ptr to manipulate the Integer\n";
ptrToInteger->setInteger(99);
cout<<"After setInteger: "<<(*ptrToInteger).getInteger()
<<"\n\nTerminating program"<<endl;
return 0;
}
执行的结果如下:
关于异常处理的就说道这里吧。谢谢