【C++】那些年写过的bug <No.002> —— memset()初始化动态成员变量

一、 错误代码示范

先贴错误代码(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,会导致内存泄漏或程序崩溃
相反,直接初始化结构体的成员变量是更安全和可靠的做法。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

油炸自行车

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值