list push_back包含字符串类型核心的结构

时间:2013-08-12 08:23:45

标签: c++ string stl

我编写了一个示例代码,当列表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()核心。我不知道为什么。谢谢

2 个答案:

答案 0 :(得分: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;

答案 1 :(得分:2)

memcpy(&pack,&packet,sizeof(packet));

这不是复制非POD对象的有效方法,也没有理由将它用于POD对象。只需使用赋值运算符(operator=)。或者是复制构造函数。