2009-05-27 19 views
20

我正在使用GetStringUTFChars從Java代碼中使用JNI檢索字符串的值,並使用ReleaseStringUTFChars釋放字符串。當代碼在JRE 1.4上運行時,沒有內存泄漏,但是如果相同的代碼運行JRE 1.5或更高版本,則內存會增加。這是代碼的一部分使用JNI從Java代碼檢索字符串值的內存泄漏

msg_id=(*env)->GetStringUTFChars(env, msgid,NULL); 
opcdata_set_str(opc_msg_id, OPCDATA_MSGID, msg_id); 
(*env)->ReleaseStringUTFChars(env, msgid,msg_id); 

我無法理解泄漏的原因。有人可以幫忙嗎?


這是因爲如果我評論其餘的代碼,但留下這部分內存泄漏發生。這是代碼的一部分,我使用

JNIEXPORT jobjectArray JNICALL Java_msiAPI_msiAPI_msgtoescalate(JNIEnv *env, 
                   jobject job, 
                   jstring msgid, 
                   jlong msgseverity, 
                   jstring msgprefixtext, 
                   jint flag) 
{ 
    opcdata  opc_msg_id; /* data struct to store a mesg ID  */ 

    const char   *msg_id; 
    int   ret, ret2; 
    jint val; 
    val=67; 
    jstring str=NULL; 
    jobjectArray array = NULL; 
    jclass sclass=NULL; 
    /* create an opc_data structure to store message ids of */ 
    /* messages to escalate         */ 
    if ((ret2=opcdata_create(OPCDTYPE_MESSAGE_ID, &opc_msg_id))!= OPC_ERR_OK) 
    { 
    fprintf(stderr, "Can't create opc_data structure to store message. opcdata_create()=%d\n", ret2); 
    cleanup_all(); 
    } 

    ////////////////////////////////////////////////////////// 
    msg_id=(*env)->GetStringUTFChars(env,msgid,NULL); 
    opcdata_set_str(opc_msg_id, OPCDATA_MSGID, msg_id); 
    (*env)->ReleaseStringUTFChars(env, msgid, msg_id); 
    ret=opcmsg_ack(connection,opc_msg_id); 
    ////////////////////////////////////////////////////////// 

    if(flag==0 && ret==0) 
    { 
    sclass = (*env)->FindClass(env, "java/lang/String"); 
    array = (*env)->NewObjectArray(env, 2, sclass, NULL); 
    str=(*env)->NewStringUTF(env,"0"); 
    (*env)->SetObjectArrayElement(env,array,0,str); 
    (*env)->DeleteLocalRef(env, str); 
    str=(*env)->NewStringUTF(env,"0"); 
    (*env)->SetObjectArrayElement(env,array,1,str); 
    (*env)->DeleteLocalRef(env, str); 
    } 

    opcdata_free(&opc_msg_id); 

    if(ret!=0) 
    return NULL; 
    else 
    return(array); 
} 

在一個以上的是,如果我評論之間/////我沒有看到任何內存泄漏的部分。

+5

看起來好,你怎麼知道這是你泄漏的原因? – 2009-05-27 14:08:12

回答

1

Release array object。

(* env) - > DeleteLocalRef(env,array);