gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:14:57 30 4
gpt4 key购买 nike

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

MyObj *obj = this->generateObj();
emit newObjSignal(obj);
delete obj;

我有一个或多个人与此有联系。问题是删除调用在对象接收到信号之前被调用。我该如何处理?

最佳答案

使用智能指针,这样内存管理将自动处理,您将确信您将拥有:

  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!

另请注意,处理函数必须接受 std::shared_ptr<MyObj>。而不是原始指针 MyObj* ,但不必更改这些处理程序中的代码,因为 std::shared_ptr提供 operator -> 的重载.

请注意,一般情况下,使用 new不鼓励在 C++11 中使用,尽可能使用 std::make_shared<>创建shared_ptr秒。因此,您可能想要重写您的 generateObj()成员函数,以便它返回 std::shared_ptr<MyObj>而不是 MyObj* , 并让它使用 std::make_shared<MyObj>()在内部实例化对象。

注意:

正如 Geier 指出的那样评论里Qt有自己的智能指针类QSharedPointer你可能想要使用。

关于c++ - 你如何处理内存管理和信号/插槽?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15590577/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com