关于函数中的new操作导致的内存泄漏的问题???

zxhutu 2005-05-06 08:44:53
请教各位:
下面是一个实现jni中的字符转换的功能的函数,这个函数里面rtn 出现了malloc的操作,而在这个函数里有不能释放,因为要将这个结果返回,可是使用这个函数的人不知道要释放这段内存,这样就造成了内存的泄漏,请问各位有什么好的方法能避免呢? 是不是将结果作为out的参数返回呢。

char* jstringToWindows( JNIEnv *env, jstring jstr )

{
int length = (env)->GetStringLength(jstr );
const jchar* jcstr = (env)->GetStringChars(jstr, 0 );
char* rtn = (char*)malloc( length*2+1 );//-------------就是这里了
int size = 0;
size = WideCharToMultiByte( CP_ACP, 0, (LPCWSTR)jcstr, length, rtn,(length*2+1), NULL, NULL );
if( size <= 0 )
return NULL;
(env)->ReleaseStringChars(jstr, jcstr );
rtn[size] = 0;
return rtn;
}

注:其中的env jstring等都是更java的jni相关的参数

...全文
329 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
blackmouth 2005-05-09
  • 打赏
  • 举报
回复
楼主的程序里面有两个地方可能内存泄露的:
1:
...
if( size <= 0 )
return NULL;//还没释放就return,丢失指针,内存泄露!这是程序中的错误
...
2:
...
return rtn;//返回指针,在调用本函数的地方忘记释放内存,内存泄露!这是个危险
...
所以我针对这两个地方改正如下:
1:
将if( size <= 0 )
return NULL;
改成:if( size <= 0 )
{
free...;
return NULL;
}
2:记得在调用函数中用free
brucelee0224 2005-05-09
  • 打赏
  • 举报
回复
up
ihsgnep 2005-05-09
  • 打赏
  • 举报
回复
关注
zxhutu 2005-05-09
  • 打赏
  • 举报
回复
楼上的楼上,
这个程序是解决jni中传递中文或日文参数时乱码的问题的,并不是使用jni错误。
看了前面几位的说法,看来没有什么好的方法了,只能在调用该函数的地方去释放了,是不?
caslwzgks 2005-05-09
  • 打赏
  • 举报
回复
你好象错误地使用了JNI,JNI是让JAVA调用DLL,同时在DLL中也可以使用JAVA对象。JNI提供了字符转换函数及字符串对象jstring所以你不必须返回char * 而应该返回jstring这样就不会有内存泄漏问题了。另外在JNI中我想是不能使用智能指针的。因为JAVA不能理解C++类(或者说JNI不支持C++类)如果在C++中使用智能指针就是一个非常好的方案了如下所示:

struct ArrayFreePtr
{
ArrayFreePtr(char * ptr):ptr_(ptr){}
ArrayFreePtr(const ArrayFreePtr & rhs)
{
ptr_ = rhs.ptr_;
rhs.ptr_ = 0;
}
~ArrayFreePtr(){ free( ptr_ );

ArrayFreePtr & operator=(const ArrayFreePtr & rhs)
{
if( this != &rhs)
{
reset(rhs.ptr_);
rhs.ptr_ = 0;
}
return *this;
}

char * get()const { return ptr_;}
void reset( char * ptr = 0 ) {
if( ptr_ )
free( ptr_);
ptr_ = ptr;
}
char * release(){ char * ret = ptr_; ptr_ = 0; return ret;}
char * ptr_;
};


ArrayFreePtr fun( JNIEnv *env, jstring jstr )
{
......
ArrayFreePtr result;
.......
return result;
}

  • 打赏
  • 举报
回复
:-)
强烈反对楼上
个人观点,对事不对人啊
j2y2 2005-05-08
  • 打赏
  • 举报
回复
个人观点:
程序里就不应该有单独存在的函数,用类封装。
动态开辟能不用最好不用。
zxhutu 2005-05-07
  • 打赏
  • 举报
回复
char* rtn = (char*)malloc( length*2+1 );//-------------就是这里了
--------------------
让调用者new,然后把rtn作为参数传到这个函数里,delete的话也让调用者去做。

************************
如果让调用者new的话,他就得先判断str的长度,操作就比较麻烦了,是不?
另:tutu82(C**) 老兄说不用malloc,那怎么办呢,要把char传回去的丫,不new怎么办?
qinxiaolin 2005-05-07
  • 打赏
  • 举报
回复
如果仅仅是提供给别的人调用,而不是写这个函数的人使用的话,除非使用这个函数的人自己释放rtn所分配的内存,不然肯定会有内存泄漏!
要不就把函数封装到类中,然后在析构函数里delete就可以了.
youngphoneix 2005-05-07
  • 打赏
  • 举报
回复
用vector不就完了吗?在函数的接口里增加一个vector的引用不就OK了?
cunsh 2005-05-07
  • 打赏
  • 举报
回复
楼上的不知道你说的是让哪个使用灵巧指针?
diandian82 2005-05-07
  • 打赏
  • 举报
回复
使用smart pointer
zhongwei5695 2005-05-07
  • 打赏
  • 举报
回复
请配合好
new *p --- delete p
new *p[]---delete [] p
nasi00 2005-05-07
  • 打赏
  • 举报
回复
可以把free()写在finalize()里面,或者自己写一个cleanup(),然后

try { ... } finally { a.cleanup(); } 这样,然后在cleanup()里面free()。

没试验,觉得这么做应该可以。
j2y2 2005-05-07
  • 打赏
  • 举报
回复
把该函数放到需要此操作的类中,作为成员函数。
减少数据向类的外面扩散。
277894613 2005-05-06
  • 打赏
  • 举报
回复
看不懂啊
charlse168 2005-05-06
  • 打赏
  • 举报
回复
http://www.eimhe.com/bbs/get.php?id=101448
学习网站,超多学习视频下载
tutu82 2005-05-06
  • 打赏
  • 举报
回复
我觉得那就不要用malloc了。。。
zhousqy 2005-05-06
  • 打赏
  • 举报
回复
char* rtn = (char*)malloc( length*2+1 );//-------------就是这里了
--------------------
让调用者new,然后把rtn作为参数传到这个函数里,delete的话也让调用者去做。

64,282

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧