JNI内存泄漏

============问题描述============


jboolean

Java_com_test_Image_isImageFormat(JNIEnv* env, jobject obj, jstring path)

{

    FILE *fis = NULL;

    jboolean ret = JNI_FALSE;

    unsigned short pis[128];

    char cString[256];



    const char *fileName = (*env)->GetStringUTFChars(env, path, 0);



    char *p = strrchr(fileName, '.');

    if(p == NULL)

    {

    	(*env)->ReleaseStringUTFChars(env, path, fileName);

    	return JNI_FALSE;

    }



    short int i = 0;

    char *q  = p;

    for(i = 0; i < strlen(q); i++)

    	*(q+i) = tolower(*(q+i));



    strcpy(cString, fileName);



    (*env)->ReleaseStringUTFChars(env, path, fileName);



    if((fis=fopen(cString, "r"))==NULL)

    {

    	__android_log_print(ANDROID_LOG_ERROR, "isImageFormat", "=============Can not open the file==================");

    	fclose(fis);

    	return JNI_FALSE;

    }



    fread(pis, 8, 1, fis);

.

.

.

}


首先要说的是,这函数会被频繁调用;
而这段代码常报内存泄漏,但是实在找不出哪里导致的内存没有释放啊!懂的人帮忙看看!

============解决方案1============


函数不全,怎么知道有没有内存泄漏呢。
fis这个句柄后面有关闭吗?

另外有几个问题:
1.strlen重复调用,效率很低。
for(i = 0; i < strlen(q); i++)

        *(q+i) = tolower(*(q+i));


2.没有字符串长度检查,可能导致内存写越界。
strcpy(cString, fileName);

============解决方案2============


if((fis=fopen(cString, "r"))==NULL)

    {

        __android_log_print(ANDROID_LOG_ERROR, "isImageFormat", "=============Can not open the file==================");

        fclose(fis);

        return JNI_FALSE;

    }

LZ都知道是这段代码出错了!很明显文件都没有打开成功,却去做关闭文件句柄的操作。。能不报错吗?

转载于:https://www.cnblogs.com/lianxu61/p/4046134.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值