我对这个很好的例子的抱怨:https ://www.qt.io/blog/2006/12/04/threading-without-the-headache是它正在交换裸指针并且它没有使用 Qt::排队连接。
编辑:这是上面链接显示的代码片段(以防链接在这篇文章之前关闭)
// create the producer and consumer and plug them together
Producer producer;
Consumer consumer;
producer.connect(&consumer, SIGNAL(consumed()), SLOT(produce()));
consumer.connect(&producer, SIGNAL(produced(QByteArray *)), SLOT(consume(QByteArray *)));
// they both get their own thread
QThread producerThread;
producer.moveToThread(&producerThread);
QThread consumerThread;
consumer.moveToThread(&consumerThread);
// go!
producerThread.start();
consumerThread.start();
如果我在生产者中使用了一个 unique_ptr,当我调用产生的信号时释放它,并直接将裸指针放入连接的消费槽中的另一个唯一指针,它会更安全一些。尤其是在一些维护程序员尝试了代码之后;)
void calculate()
{
std::unique_ptr<std::vector<int>> pi(new std::vector<int>());
...
produced(pi.release());
//prodiced is a signal, the connected slot destroys the object
//a slot must be connected or the objects are leaked
//if multiple slots are connected the objects are double deleted
}
void consume(std::vector<int> *piIn)
{
std::unique_ptr<std::vector<int>> pi(piIn);
...
}
这仍然有几个主要问题:
- 未连接插槽时,我无法防止泄漏
- 如果要连接多个插槽,我不会防止双重删除(如果发生这种情况,应该是程序员的逻辑错误,但我想检测它)
- 我不太了解 Qt 的内部工作,无法确保在运输过程中没有任何泄漏。
如果我要使用指向 const 的共享指针,它将解决我所有的问题,但速度会更慢,据我所知,我必须将它注册到元对象系统,如下所述:http: //qt-project.org/ doc/qt-4.8/qt.html#ConnectionType-enum这是个好主意吗?
有没有更好的方法可以做到这一点,我没有想到?