【发布时间】:2016-04-23 11:50:40
【问题描述】:
我有一个函数在我的代码中使用了一百万次,但其中存在内存泄漏。
它将const wchar_t* 作为输入并返回const char*。
现在我知道返回的指针 (const char*) 需要从调用函数中获得显式的 delete[](但我负担不起),因为这意味着我需要在所有位置更改它。
代码如下:
inline const char * W2N(const wchar_t* wstr)
{
int cw=lstrlenW(wstr);
if (cw==0)
{
CHAR *psz=new CHAR[1]; *psz='\0'; return psz;
}
int cc=WideCharToMultiByte(CP_ACP,0,wstr,cw,NULL,0,NULL,NULL);
if (cc==0) return NULL;
CHAR *psz=new CHAR[cc+1];
cc=WideCharToMultiByte(CP_ACP,0,wstr,cw,psz,cc,NULL,NULL);
if (cc==0)
{
delete[] psz; return NULL;
}
psz[cc]='\0';
return psz;
}
我可以围绕这个函数做些什么来避免内存泄漏。
【问题讨论】:
-
同意bi303,但最后返回的指针psz导致泄漏,因为它从未被释放。
-
你知道客户端调用函数什么时候会用完
W2N()返回的内存吗? -
为什么不用
std::string而不是char *? -
通过使用分配内存的函数,您“签署合同”并负责在必要时解除分配。您的代码状况不佳,任何棘手的解决方案都会使情况变得更糟。更改代码,使您的函数返回
std::unique_ptr<char[]> fact(new char[size]);(假设您在 C++ 环境中)或返回 std::string
标签: c++ memory-leaks