cha*_*m15 4 c++ qt memory-management
我有一个对象,它发出一个带有对象的信号:
MyObj *obj = this->generateObj();
emit newObjSignal(obj);
delete obj;
Run Code Online (Sandbox Code Playgroud)
我有一个或多个人连接到这个.问题是在对象接收信号之前调用delete调用.我该如何处理?
使用智能指针,以便自动处理内存管理,您将确保您将拥有:
在这种情况下,在我看来std::shared_ptr<>(或std::tr1::shared_ptr<>或者boost::shared_ptr<>,如果你不与C++ 11的工作)是正确的选择:
#include <memory> // For std::shared_ptr<>
// ...
std::shared_ptr<MyObj> obj(this->generateObj());
emit_new_signal(obj);
// delete obj; // <== No need for this anymore!
Run Code Online (Sandbox Code Playgroud)
另请注意,处理函数必须接受std::shared_ptr<MyObj>而不是原始指针MyObj*,但这些处理程序中的代码不必更改,因为std::shared_ptr提供了重载operator ->.
请注意,通常,new在C++ 11中不鼓励使用,并且在可能的情况下应该使用std::make_shared<>创建shared_ptrs.因此,您可能希望重写您的generateObj()成员函数,以便它返回一个std::shared_ptr<MyObj>而不是一个MyObj*,并让它在std::make_shared<MyObj>()内部使用来实例化该对象.
注意:
正如Geier在评论中所指出的,Qt有自己的智能指针类QSharedPointer,你可能想要使用它.