在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 *数据包是否正确? 有时我的程序崩溃所以删除信号/槽中传递的指针的最佳方法是什么(我想我必须删除pkt,因为我在“interpretData”方法中实例化了一个新的数据包)。
答案 0 :(得分:2)
可以有一个任意数量的插槽连接到一个信号(包括零和多个!),所以你应该永远期望一个插槽来释放通过裸<传递的内存< / em>指针。
您应该传递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();
}
答案 1 :(得分:1)
假设PacketClass派生自QObject,则调用deleteLater函数: -
pkt->deleteLater();
这将处理在处理信号和插槽之后以及当控制返回到事件循环时在正确的时间删除对象。
请参阅deleteLater here的文档,该文档也与Qt4
相关