假设我们现在设计一个管理投资的类。它有很多个派生类负责不同的投资,我们使用工厂函数构造它的派生类。这涉及到一些工厂方法模式,这里我们不细说。只需要知道这个工厂方法返回一个父类指针,但他指向的是子类的对象。
class Investment{}
Investment* createInvestment();
由于是个指针,这个指针的对象是我们new出来的。那么久需要被delete掉。
int main() {
Investment *pInv = createInvestment();
// some statements.
...;
delete pInv;
}
这看起来很ok,但是万一我们在...中过早的return。就可能delete不到,出现内存泄露的问题。最好的方法就是保证这个指针一定会被delete。
可以使用智能指针auto_ptr。(书中用auto_ptr,但是c++11已经把他废除了,建议用unique_ptr替换)
int main() {
std::auto_ptr<Investment> pInv(createInvestment());
}
智能指针管理内存的两个重要思想:
unique_ptr在赋值以后会将原来的指针指向nullptr,也就是保证只有一个unique_ptr指向某个对象。
但可以有多个shared_ptr指向同一对象,在shapred_ptr内部有一个引用计数。当最后一个指针生命周期结束时,会调用delete方法,释放内存。
但是不管是unique还是shared,他们都只会调用delete而非delete[],因此我们不能将new出来的一个数组给智能指针。
原文:https://www.cnblogs.com/destinyzk/p/14962918.html