Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xcode/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ memset正在导致std::字符串分配崩溃_C++_Xcode_String_Crash_Memset - Fatal编程技术网

C++ memset正在导致std::字符串分配崩溃

C++ memset正在导致std::字符串分配崩溃,c++,xcode,string,crash,memset,C++,Xcode,String,Crash,Memset,我有可以在Windows上运行的代码,但现在我正在使用Xcode 3.2.5 C/C++编译器GCC4.2将其移植到MAC上,它崩溃了 我已经把范围缩小到一个memset调用。如果我注释掉memset,它就会工作,如果我把它放回代码中,它就会崩溃 我的头文件中有一个类似的结构: typedef struct { int deviceCount; struct { #define MAX_DEVICE_ID 256 #define MAX

我有可以在Windows上运行的代码,但现在我正在使用Xcode 3.2.5 C/C++编译器GCC4.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
。。。稍后我有这个:

DeviceParams Param;
memset(&Param, nil, sizeof(Param));
pParam->deviceNodes[index].deviceId = "some string"; // <----- Line that crashes with memset

pParam->deviceNodes[index].deviceId=“一些字符串”//<在C++中,在非数据类型上调用<代码> MeMSET()/<代码>是非法的。包含
std::string
成员的结构不是POD。

您正在覆盖
deviceId
的内部数据,方法是在其上执行
memset
;不要在任何事情上做
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];
};
然后


只是为了详细说明答案…它在Mac上崩溃(可能是任何使用GCC的平台),因为
std::string
的内部状态在设置为所有空指针时恰好无效。当类包含具有非平凡构造函数的成员(例如具有实际定义的构造函数)时,它的构造函数被定义为使用平凡构造函数将成员归零,并调用非平凡构造函数。因此,不要担心
eTransportType
。当然,最好的方法是命名嵌套类型并定义其构造函数,从而避免
memset