我正在学习如何使用正确的指针和智能指针'防止内存泄漏。这是我正在分析的伪代码片段。 [ClassA和ClassB继承BaseClass; ExtClass只是一些外部类(与BaseClass无关)
main(){
ExtClass *extPtr = new ExtClass();
BaseClass *ptr = new ClassA();
extPtr->setPtr(ptr);
extPtr->fun();
...
if(change_object()) {
delete ptr;
ptr = new ClassB();
extPtr->setPtr(ptr);
extPtr->fun();
}
}
-------------------------------------
ExtClass {
private:
BaseClass *m_ptr;
public:
~ExtClass() { delete m_ptr; }
void ExtClass::fun(){
m_ptr->do_some_stuff();
}
void ExtClass::setPtr(BaseClass *ptr){
m_ptr = ptr;
}
}
问题:
答案 0 :(得分:0)
好的基类,如果退出函数,extPtr
将被泄露。
要将智能指针交换到另一个,我相信这就是你想要的:http://en.cppreference.com/w/cpp/memory/unique_ptr/swap
顺便说一句,我在你的代码中根本看不到任何智能指针。
答案 1 :(得分:0)
写一个真正的智能指针有很多问题,我在你的代码中看不到它们中的一些:
代码不安全,ExtClass
没有明确定义的构造函数
和复制构造函数。
它不聪明,它不会避免复制内部指针
ExtClass
。
它应该能够避免裸分配。
extPtr
本身是一个裸指针(它可以泄漏)
如果在分配extPtr
和ptr
时抛出异常怎么办?
避免这些问题的最佳选择是使用标准智能指针,例如std::unique_ptr
。