Qt 删除指针方法

Qt deletion pointer method

本文关键字:方法 指针 删除 Qt      更新时间:2023-10-16

在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
}

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

信号

可以附加任意数量的插槽(包括零个和多个!),因此您永远不应该期望插槽释放通过指针传递的内存。

您应该传递QSharedPointer<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();
}

假设 PacketClass 派生自 QObject,则调用 deleteLater 函数: -

pkt->deleteLater();

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

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