2

在 Qt 项目中,我有一个方法

void ProtocolHandler::interpretData(uint8_t packet_id){
    PacketClass *packet = new RSP2StatusPacket(_packet_buf);
    emit packetReceived(packet);
}

我在其中声明一个 PacketClass 类型的对象包,然后发出信号

packetReceived (PacketClass*)

在另一堂课中,我有以下插槽:

void ReceiverCommands::processReceivedPacket(PacketClass* pkt)
{
    status_packet *payload = pkt->getPayload();

    delete pkt
}

在 slot 方法中删除较新的 PacketClass *packet 是否正确?有时我的程序崩溃了,那么删除在信号/插槽中传递的指针的最佳方法是什么(我想我必须删除 pkt,因为我在“interpretData”方法中实例化了一个新数据包)。

4

2 回答 2

2

可以有任意数量的槽连接到一个信号(包括零个和多个!),所以你不应该期望一个槽释放通过指针传递的内存。

你应该通过 aQSharedPointer<PacketClass>并使用它。它将在需要时进行删除。

typedef QSharedPointer<PacketClass> PacketClassPtr;
Q_DECLARE_METATYPE(PacketClassPtr)

ProtocolHandler {
    ...
    Q_SIGNAL void packetReceived(PacketClassPtr packet);
}

void ProtocolHandler::interpretData(uint8_t packet_id){
    PacketClassPtr packet(new RSP2StatusPacket(_packet_buf));
    emit packetReceived(packet);
}

void ReceiverCommands::processReceivedPacket(PacketClassPtr pkt)
{
    status_packet *payload = pkt->getPayload();
}
于 2013-10-14T18:49:10.403 回答
1

假设 PacketClass 是从 QObject 派生的,那么调用 deleteLater 函数:-

pkt->deleteLater();

这将在正确的时间处理删除对象,在它处理完信号和槽之后以及当控制权返回到事件循环时。

请参阅此处的 deleteLater 文档,该文档也与 Qt4 相关

于 2013-10-14T16:19:17.617 回答