当前位置: 代码迷 >> VC/MFC >> 请教这个是内存泄漏吗?如果是怎样解决
  详细解决方案

请教这个是内存泄漏吗?如果是怎样解决

热度:164   发布时间:2016-05-02 03:51:43.0
请问这个是内存泄漏吗?如果是怎样解决?
有个朋友说我这样写是内存泄漏,不知道是不是,我这个DLL是给其它语言调用的,但是如果是不知道该怎样处理,谢谢

int   __stdcall  postsbinv(char * str,char ** retstring)
{
 wstrinvnum=“1215265152”;
size_t outputSize = wstrinvnum.length() + 1; // +1 for null terminator
char * retinvnumtemp = new char[outputSize];//可能这里没用释放内存
size_t charsConverted = 0;
const wchar_t * wchar_invnum = wstrprodno.c_str();
wcstombs_s(&charsConverted, retinvnumtemp, outputSize, wchar_invnum, wstrinvnum.length());
*  retstring = retinvnumtemp;
}

求解决办法,谢谢
------解决思路----------------------
在外面释放retstring
------解决思路----------------------
那就改变一下函数声明, 让调用者自己处理缓冲区

int   __stdcall  postsbinv(const char * str, //输入字符串
  char * retstring, //结果缓冲区
  int buffLen) //结果缓冲区大小
{
}
------解决思路----------------------
也可以再提供的一个释放资源的函数: void   __stdcall  freeString(char* retstring);
当 成功调用完 postsbinv 后,再调用 freeString 释放 postsbinv 返回的内存
------解决思路----------------------
引用:
但是我这个是DLL内的函数,怎样释放?


和是否是dll没有关系,由函数的调用者释放
------解决思路----------------------
或者,你可以像很多API那样设计函数

int aFun(char buf[],int size)
{
.........
   return copy_data(buf,funData);// buf调用者提供的缓冲区,size缓冲区长度,返回值:拷贝的数据长度
}
------解决思路----------------------
其实有一种方法叫做函数指针。
void DllFunc( char* src, void (*)(char* buf, int size) out_func )
{
char* dest = new dest[100]
ChangeString(src, dest);
out_func(dest, 100);
}
------解决思路----------------------
int   __stdcall  postsbinv(char * str,char ** retstring)
{
 wstrinvnum=“1215265152”;
size_t outputSize = wstrinvnum.length() + 1; // +1 for null terminator
char * retinvnumtemp = new char[outputSize];//可能这里没用释放内存
size_t charsConverted = 0;
const wchar_t * wchar_invnum = wstrprodno.c_str();
wcstombs_s(&charsConverted, retinvnumtemp, outputSize, wchar_invnum, wstrinvnum.length());
*  retstring = retinvnumtemp;
}
其实你可以完全省略这个char * retinvnumtemp = new char[outputSize],
函数开始判断retstring地址有效性,然后wcstombs_s函数直接操作retstring就好了,不用那个retinvnumtemp 变量
------解决思路----------------------
buffer最好是api调用者申请,调用者使用完成后释放
  相关解决方案