在 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
}
在槽方法中删除较新的PacketClass *packet是否正确? 有时我的程序会崩溃,那么删除信号/槽中传递的指针的最佳方法是什么(我想我必须删除 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();
}
关于c++ - Qt删除指针方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19364172/