3

我有在 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 上?

谢谢。

4

2 回答 2

14

您正在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";
于 2012-01-04T01:52:11.977 回答
11

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

于 2012-01-04T01:51:53.010 回答