1

私はサンプル コードを書きます。リストを push_back すると、常にコアダンプが発生します。これが私のコードです。

#include <iostream>
#include <list>
#include <string.h>
using namespace std;
struct FDTinstance
{
    int type;
    unsigned int expirestime;
    unsigned int fileTOI;
    string filename;
    unsigned int contentlength;
    unsigned long long T3; 
    unsigned long long T1; 
    unsigned long long T4; 
    unsigned long long sessionstarttime;
};
struct PacketInfo
{
    unsigned int port;
    unsigned long long arrivetime;
    unsigned int syncType;
    unsigned short timeStamp;
    unsigned short packNum;
    unsigned int packCount;
    unsigned int TSI;
    unsigned int TOI;
    FDTinstance fDTinstance;
};
int main(int argc, char* argv[])
{
    struct PacketInfo packet;
    packet.fDTinstance.filename = "http://123.com";
    packet.syncType=1;
    packet.fDTinstance.expirestime = 100;
    packet.fDTinstance.fileTOI = 0;
    struct PacketInfo pack;
    memcpy(&pack, &packet, sizeof(packet));
    mVodList.push_back(pack);//cause core
    return 0;
}

を使用すればconst char* filename、プログラムは問題ありません。しかし、文字列型を使用すると、プログラムは でコアになりpush_back()ます。理由はわかりません。ありがとうございます

4

2 に答える 2

3

を削除して、次のmemcpyようにします。

PacketInfo pack = packet;

またはさらに良いことに、中間コピーを完全に忘れて、次のようにします。

mVodList.push_back(packet); // stores a copy of packet

その理由は、memcpyPOD タイプでのみ機能しstd::string、それらの 1 つではないためです。いずれにせよ、POD の場合でも、コピー コンストラクターまたは代入演算子を使用することは、あるオブジェクトを別のオブジェクトにコピーする慣用的な方法です。

また、C++ では、あちこちに記述する必要がないことに注意してくださいstruct。では、なぜこれを言うのか

struct PacketInfo packet;

これはいつ言えますか?

PacketInfo packet;
于 2013-08-12T08:27:17.433 に答える
2
memcpy(&pack,&packet,sizeof(packet));

これは、POD 以外のオブジェクトをコピーする有効な方法ではありません。また、POD オブジェクトに使用する理由もありません。代入演算子 ( operator=) を使用するだけです。またはコピーコンストラクタ。

于 2013-08-12T08:27:14.233 に答える