memset 导致 std::string 分配崩溃
我的代码可以在 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 字符串会在赋值行上崩溃并且仅在 MAC 上崩溃?
谢谢。
I have code that works on Windows, but now that I am porting to a MAC, using Xcode 3.2.5 C/C++ Compiler Version GCC 4.2, it crashes.
I have narrowed it down to a memset call. If I comment out the memset it works, and if I put it back in the code crashes.
I have a structure that looks like this in my header file:
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;
Then in a cpp file I have this:
DeviceParams Param;
memset(&Param, nil, sizeof(Param));
... later I have this:
pParam->deviceNodes[index].deviceId = "some string"; // <----- Line that crashes with memset
Like I said before if I remove the memset call everything works fine. If I look at the debugger before I call the memset my strings in the structure are \0 and after the memset they are nil.
Why does the nil string crash on a assignment line and only on a MAC?
Thanks.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
您通过执行
memset
来覆盖deviceId
的内部数据;除了 POD 数据类型之外,不要对任何内容执行memset
。这是C++,我们有构造函数。你的代码应该看起来像这样:然后
You're overwriting
deviceId
's internal data by doingmemset
all over it; don't ever domemset
over anything but a POD data type. This is C++, we have constructors. Your code should look something like this:Then
在 C++ 中,在非 PODmemset() 是非法的> 数据类型。包含
std::string
成员的结构不是 POD。It is illegal in C++ to call
memset()
on a non-POD data type. Structures containingstd::string
members are not POD.