gpt4 book ai didi

c++ - postEvent 是否在发布后释放事件? (双重自由或腐败)

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

我正在使用 QCoreApplication::postEvent 发布从 QEvent 继承的自定义事件。我读到过,在使用 postEvent 时,必须有堆分配事件。但我不确定谁负责释放它。

因此,我尝试使用 std::shared_ptr。但是,当我使用 std::shared_ptr 创建我的事件时,出现了这个错误:

double free or corruption (fasttop)

这是否意味着 QEvent 负责释放事件,这样我就可以创建事件而不用删除它?

代码如下:

class MyCustomEvent : public QEvent {...}

std::shared_ptr<MyCustomEvent> evt(new MyCustomEvent(arg1, arg2)); // double free or corruption!
QCoreApplication::postEvent(targetObj, evt.get());

最佳答案

来自 QCoreApplication::postEvent 的文档:

The event must be allocated on the heap since the post event queue will take ownership of the event and delete it once it has been posted. It is not safe to access the event after it has been posted.

因此,在发布后为事件维护一个 std::shared_ptr 是不正确的,因为发布会将事件的所有权转移到队列中。

一个安全的方法是将事件保存在 std::unique_ptr 中(最好使用 std::make_unique),然后调用 release 当你发布事件时。这样,您可以确保如果在发布之前抛出异常,资源将被释放,并且您不会进行双重释放。您不一定需要使用智能指针,尤其是在这种简单的情况下,但我认为在维护时尝试保持内存所有权异常安全是一件好事™。

// C++14 idiomatic exception-safe event posting in Qt
auto evt = std::make_unique<MyCustomEvent>(arg1, arg2);
// intervening code that could throw
QCoreApplication::postEvent(targetObj, evt.release());

// C++11 idiomatic exception-safe event posting in Qt
std::unique_ptr<MyCustomEvent> evt { new MyCustomEvent(arg1, arg2) };
// intervening code that could throw
QCoreApplication::postEvent(targetObj, evt.release());

// C++98 idiomatic exception-safe event posting in Qt
QScopedPointer<MyCustomEvent> evt (new MyCustomEvent(arg1, arg2));
// intervening code that could throw
QCoreApplication::postEvent(targetObj, evt.take());

关于c++ - postEvent 是否在发布后释放事件? (双重自由或腐败),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32583078/

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