一、 错误代码示范
先贴错误代码(Demo):
typedef struct
{
int nValue1;
int nValue2;
int nValue3;
std::vector<int> vValue;
}T_DemoStruct;
T_DemoStruct t_DemoStuc;
memset(&t_DemoStuc, 0, sizeof(t_DemoStuc)); ///< 这里有错误
以上代码原意是想将t_DemoStuc这个结构体对象的所有成员的初始值都初始化为0。
然而,对于结构体中包含动态分配内存的成员变量(如
std::vector),使用memset()并不安全或正确,因为它不能正确处理动态分配的内存。
二、 更正方法
2.1 方法一
最简单的方法就是对结构体成员一个一个赋值,如下:
typedef struct
{
int nValue1;
int nValue2;
int nValue3;
std::vector<int> vValue;
}T_DemoStruct;
T_DemoStruct t_DemoStuc;
t_DemoStuc.nValue1 = 0;
t_DemoStuc.nValue2 = 0;
t_DemoStuc.nValue3 = 0;
T_DemoStruct.vValue.clear(); ///< 调用容器的clear()方法进行初始化
上面这种写法,在多次实例化T_DemoStruct对象时会很麻烦,在C++中也可以写一个结构体默认构造函数,如下:
2.2 方法二
typedef struct
{
int nValue1;
int nValue2;
int nValue3;
std::vector<int> vValue;
// 默认构造函数
T_DemoStruct()
: nValue1(0), nValue2(0), nValue3(0)
{
vValue.clear();
}
}T_DemoStruct;
三、 总结
memset() 是一个基于字节的操作,不会调用 std::vector 或其他非POD(平凡标量类型)成员的构造函数或析构函数。这可能导致未定义的行为,特别是对于 std::vector,会导致内存泄漏或程序崩溃。
相反,直接初始化结构体的成员变量是更安全和可靠的做法。
1018

被折叠的 条评论
为什么被折叠?



