在写函数时往往需要指针来传参,也会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};
记录下踩坑现场,谨防再次踩坑。
本文介绍了C++编程中一个常见的陷阱,即在函数内部使用new分配的指针返回后,由于内存未正确初始化导致的内存泄漏问题。通过分析错误代码和提供修正后的代码,强调了内存初始化的重要性以及delete操作时应确保长度匹配,以防止内存异常。此外,还提醒开发者注意指针内存管理,以避免后续使用中的潜在风险。
2781

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



