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 を削除するのは正しいですか? ときどきプログラムがクラッシュするので、シグナル/スロットで渡されたポインターを削除する最良の方法は何ですか (「interpretData」メソッドで新しいパケットをインスタンス化するため、pkt を削除する必要があると思います)。

4

2 に答える 2

1

PacketClass が QObject から派生したと仮定すると、deleteLater 関数を呼び出します。

pkt->deleteLater();

これにより、シグナルとスロットの処理が完了し、コントロールがイベント ループに戻ったときに、適切なタイミングでオブジェクトの削除が処理されます。

Qt4にも関連するdeleteLater hereのドキュメントを参照してください。

于 2013-10-14T16:19:17.617 に答える