gpt4 book ai didi

c++ - Qt 信号/槽 : Is it an error to emit a signal from a temporary object?

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:35:00 27 4
gpt4 key购买 nike

在Qt中,如果从一个临时对象中调用一个信号,使得该对象可能在调用槽时被删除,这是一个错误吗?

如果相关,代码会从临时对象的构造函数发出信号。

(注意:没有指针或引用作为参数传递,所以这不是关于悬挂指针或引用的问题。我只是想知道,以最简单的形式,从Qt 中的一个临时对象。)

这是我的代码的简化版本:

// My application
class HandyApplication: public QApplication
{
Q_OBJECT
public:
explicit HandyApplication( int argc, char * argv[] );

signals:

public slots:
void handySlot(std::string const msg);

};

// Class that will be instantiated to a temporary object
class Handy: public QObject
{
Q_OBJECT

public:

Handy()
{
QObject::connect(this, SIGNAL(handySignal(std::string const)),
QCoreApplication::instance(),
SLOT(handySlot(std::string const)));

emit handySignal("My Message");
}

signals:

void handySignal(std::string const msg);

};

// An unrelated function that may be called in another thread
void myFunction()
{
Handy temporaryObject; // This constructor call will emit the signal "handySignal" above
}

如您所见,临时对象从其构造函数发出信号,然后立即销毁。 因此,可以在发送信号的对象被销毁后调用槽

这是否安全,或者这是一个潜在的问题或错误情况?

最佳答案

您指定的是 direct connection从信号到槽。这意味着在您发出 handySignal 的那一刻,它应该去执行所有连接的插槽。一旦所有插槽(即 handySlot)都已返回,发射器将返回并完成构造函数。

如果您要指定 queued connection ,如果它是从一个线程中的信号到另一个线程中的槽的连接,那么请求将被放入要执行的事件循环中。

所以我会说:是的,如果您不传递无效的引用,那么从临时对象发出信号似乎没问题。

这个例子似乎有点武断,因为我真的没有看到在构造函数中建立一个信号的连接,然后你发出信号,仅此而已。您也可以只调用该插槽,除非您希望在您未提及的不同线程中创建该对象。

编辑:

根据@Kamil 的评论,需要注意的是,如果未指定连接类型,则默认为 AutoConnection,这意味着实际类型将由目标插槽是否在不同的线程中确定比发件人。如果没有线程,它将等同于 DirectConnection。使用线程,它最终会成为一个 QueuedConnection。

关于c++ - Qt 信号/槽 : Is it an error to emit a signal from a temporary object?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16620441/

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