我的代码适用于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上崩溃?
感谢。
答案 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。