1

我写了一个示例代码,当列表 push_back 它总是导致 coredump 这是我的代码:

#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

原因是memcpy它只适用于 POD 类型,而std::string不是其中之一。在任何情况下,即使对于 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 回答