c++中经常为内存泄漏的问题而困扰。如:
void func()
{
classA * ca = new classA();
ca->funa();
//delete ca;
}
上述的例子中说明了几本的情形:指针声明在堆栈,指向堆的类,函数结束后,堆栈内存释放,而堆没有释放导致内存泄漏了。
如果把注释去除是否就可以解决了呢。
在正常情况当然可以,但是如果 ca->funa();执行存在异常就不好说了。
如何使用才可以彻底解决呢?
我们想到是否可以把堆栈的变量像类一样使用呢,这样堆栈的变量回收后,也就可以调用类的析构函数,从而把堆内存也进行回收。此时我们就可以考虑使用模板类,将所有需要申明为指针的变量都作为模板类,这也就是智能指针的实现方式。
当然实现智能指针需要重载运算符“->”,"*"
在c++11中已经可以直接调用智能指针了:shared_ptr;
上述可以这样写:
void func()
{
shared_ptr<classA> sharedptr_ca (new classA());
sharedptr_ca ->funa();
}