有个朋友说我这样写是内存泄漏,不知道是不是,我这个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没有关系,由函数的调用者释放
------解决思路----------------------
或者,你可以像很多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调用者申请,调用者使用完成后释放