你如何处理内存管理和信号/插槽?

cha*_*m15 4 c++ qt memory-management

我有一个对象,它发出一个带有对象的信号:

MyObj *obj = this->generateObj();
emit newObjSignal(obj);
delete obj;
Run Code Online (Sandbox Code Playgroud)

我有一个或多个人连接到这个.问题是在对象接收信号之前调用delete调用.我该如何处理?

And*_*owl 7

使用智能指针,以便自动处理内存管理,您将确保您将拥有:

  1. 没有悬垂的指针;
  2. 没有内存泄漏.

在这种情况下,在我看来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,你可能想要使用它.

  • Qt也有自己的共享指针,如[QSharedPointer](http://qt-project.org/doc/qt-4.8/qsharedpointer.html) (2认同)