memset导致std::string赋值崩溃

memset is causing a crash on std::string assignments

本文关键字:赋值 崩溃 string memset std 导致      更新时间:2023-10-16

我有在Windows上运行的代码,但现在我正在使用Xcode 3.2.5 C/C++编译器GCC 4.2版移植到MAC,它崩溃了。

我已经把它缩小到一个内存集调用。如果我注释掉内存集,它就可以工作,如果我把它放回代码崩溃中。

我的头文件中有一个结构,看起来像这样:

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上崩溃?

谢谢。

通过对deviceId的内部数据执行memset操作来覆盖它;除了POD数据类型之外,永远不要对任何内容执行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";

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