使用New时的长度坑

本文介绍了C++编程中一个常见的陷阱,即在函数内部使用new分配的指针返回后,由于内存未正确初始化导致的内存泄漏问题。通过分析错误代码和提供修正后的代码,强调了内存初始化的重要性以及delete操作时应确保长度匹配,以防止内存异常。此外,还提醒开发者注意指针内存管理,以避免后续使用中的潜在风险。

        在写函数时往往需要指针来传参,也会return一个指针,如果return的指针是定义在函数体内就需要用到New,一般的定义的变量(如CHAR *lpString = NULL;)存放在栈内存空间上,出了该函数的作用域就无法使用,所以return用的指针必须New出一块堆空间来(如 CHAR *lpString = New Char[nLength];),定义好需要初始化该指针,如下是踩坑代码:

LPTSTR FunctionExp(LPTSTR lpParam)
{
	TCHAR *lpString = new TCHAR[_tcslen(lpParam) + 1];
	ZeroMemory(lpString, _tcslen(lpString)*sizeof(TCHAR));						//坑在这里
	memcpy(lpString, _T("abcdefgi"), 8 * sizeof(TCHAR));
	return	lpString;
}

int main()
{
	TCHAR strDemo[20] = { _T("aabbccdd") };
	TCHAR *lpDemo = NULL;
	lpDemo = FunctionExp(strDemo);
	delete[] lpDemo;
	return TRUE;
}

问题出在_tcslen(lpSting)上,_tcslen(lpSting) 不等于_tcslen(lpParam) + 1,之后去释放堆内存Delete [] lpDemo的时候出错了。

修改后的代码如下:

LPTSTR FunctionExp(LPTSTR lpParam)
{
	TCHAR *lpString = new TCHAR[_tcslen(lpParam) + 1];
	ZeroMemory(lpString, (_tcslen(lpParam) + 1)*sizeof(TCHAR));		//按申请的长度初始化
	memcpy(lpString, _T("abcdefgi"), 8 * sizeof(TCHAR));
	return	lpString;
}

int main()
{
	TCHAR strDemo[20] = { _T("aabbccdd") };
	TCHAR *lpDemo = NULL;
	lpDemo = FunctionExp(strDemo);
	delete[] lpDemo;
	return TRUE;
}

//按申请的长度初始化或在定义时候初始化TCHAR *lpString = new TCHAR[_tcslen(lpParam) + 1]{0};

记录下踩坑现场,谨防再次踩坑。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值