memset导致std :: string赋值崩溃

时间:2012-01-04 01:49:10

标签: c++ xcode string crash memset

我的代码适用于Windows,但现在我使用Xcode 3.2.5 C / C ++编译器版本GCC 4.2移植到MAC,它崩溃了。

我把它缩小到了一个memset电话。如果我注释掉memset它可以工作,如果我把它放回代码崩溃。

我的头文件中有一个如下所示的结构:

typedef struct 
{
    int deviceCount;
    struct 
    {
        #define MAX_DEVICE_ID 256
        #define MAX_DEVICE_ENTRIES 10
        std::string deviceId;   // Device name to Open
        TransportType   eTransportType;
    } deviceNodes[MAX_DEVICE_ENTRIES];
} DeviceParams;

然后在cpp文件中我有这个:

DeviceParams Param;
memset(&Param, nil, sizeof(Param));

......后来我有了这个:

pParam->deviceNodes[index].deviceId = "some string"; // <----- Line that crashes with memset

就像我之前说的,如果我删除memset调用,一切正常。如果我在调用memset之前查看调试器,结构中的字符串是\ 0,而在memset之后它们是nil。

为什么nil字符串在赋值行上崩溃而只在MAC上崩溃?

感谢。

2 个答案:

答案 0 :(得分:14)

您通过全面覆盖deviceId来覆盖memset个内部数据;除了POD data type以外,除{{3}}以外的任何人都不会memset。这是C ++,我们有构造函数。您的代码应如下所示:

struct DeviceParams
{
    int deviceCount;

    struct DeviceNode
    {
        DeviceNode() : eTransportType() { } // initialise eTransportType
                                            // to 0, deviceId initialises itself

        static const int MAX_DEVICE_ID = 256;
        static const int MAX_DEVICE_ENTRIES = 10;

        std::string deviceId; // Device name to Open
        TransportType eTransportType;
    } deviceNodes[DeviceNode::MAX_DEVICE_ENTRIES];
};

然后

DeviceParams Param;

// get a pointer to Param in pParam

pParam->deviceNodes[index].deviceId = "some string";

答案 1 :(得分:11)

在C ++中,在非POD数据类型上调用memset()是非法的。包含std::string成员的结构不是POD。