C++ memset正在导致std::字符串分配崩溃
我有可以在Windows上运行的代码,但现在我正在使用Xcode 3.2.5 C/C++编译器GCC4.2将其移植到MAC上,它崩溃了 我已经把范围缩小到一个memset调用。如果我注释掉memset,它就会工作,如果我把它放回代码中,它就会崩溃 我的头文件中有一个类似的结构: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
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
。