memset导致std::string赋值崩溃
memset is causing a crash on std::string assignments
我有在Windows上运行的代码,但现在我正在使用Xcode 3.2.5 C/C++编译器GCC 4.2版移植到MAC,它崩溃了。
我已经把它缩小到一个内存集调用。如果我注释掉内存集,它就可以工作,如果我把它放回代码崩溃中。
我的头文件中有一个结构,看起来像这样:
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上崩溃?
谢谢。
通过对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";
在C++中对非POD数据类型调用memset()
是非法的。包含std::string
成员的结构不是POD。
相关文章:
- 为"adjacent"变量赋值时出现问题
- C++中的赋值发生,尽管右侧出现异常
- 赋值运算符在我制作类模板时使代码崩溃
- 复制赋值构造函数中的aligned_alloc内存块在释放时崩溃
- C++初始化复制构造函数中的列表赋值,并在复制构造函数中崩溃
- 为结构字段赋值时程序崩溃
- C++ 赋值崩溃
- 在 malloc 之后为数组赋值会导致崩溃
- 类成员作为对另一个的引用:赋值运算符中的崩溃
- 赋值运算符在 xcode 4 中崩溃,在MSVS2010中运行良好
- C++程序在为指针的2D数组赋值后崩溃
- memset导致std::string赋值崩溃
- 向量赋值崩溃
- 给数组赋值时崩溃
- 通过不返回引用来防止下标操作符的赋值会导致运行时崩溃
- c++在使用类方法给成员赋值时每次都会崩溃
- visualstudio-当给太多动态分配的数组赋值时程序崩溃-C++
- 是否赋值代码会导致崩溃
- 将一个glm::vec3常量引用赋值给另一个glm::vec3时奇怪的崩溃
- 自定义复制赋值操作符使程序崩溃(c++)