【发布时间】:2013-11-01 16:26:01
【问题描述】:
我有一些 C 代码实现了一个 JNI 方法,以便在调用时将 jobject 返回给 Java。在 C 代码中,我对 struct 有点兴趣,看起来有点像这样:
typedef struct {
char* something
int somethingElse
} awesomeStruct;
在 C 库中,我为结构体malloc 分配了一些内存,也为char* 分配了一些内存。
当谈到在 JNI 方法的末尾返回 jobject 时,我会这样做:
awesomeStruct *mystruct = getResult();
jstring somethingString;
jint somethingElseInt;
somethingString = (*env)->NewStringUTF(env,mystruct->something);
somethingElseInt = mystruct->somethingElse;
ret = (*env)->NewObject(env,javaClass,method,somethingString, somethingElseInt);
return ret;
希望,这应该在 javaClass 上调用 method 方法,并使用字符串和结构中的 int 的两个参数。
鉴于getResult() 为结构和字符数组执行malloc,我该如何释放它?如果我尝试在 return 语句之前释放 mystruct 或 mystruct->something,我会收到 Debug assertion Failed - CrtlsValidHeapPointer 错误,我猜这是因为返回对象包含对一旦我调用 free 就不再存在的事物的引用。
如何阻止这种泄漏?
【问题讨论】:
-
您的代码对我来说看起来不错(但请等待更好的答案,以防我完全错了)也许该错误与您为
awesomeStruct *mystruct或char* something分配内存的方式有关因此,您在尝试释放分配的内存时会得到Debug assertion Failed - CrtlsValidHeapPointer。如果你完全确定你以正确的方式分配内存,你可以忘记这条评论。 -
getResult()只是做了一个awesomeStruct mystruct = (awesomeStruct*)malloc(sizeof(awesomeStruct));我不完全确定这是否是“正确”的方式,但我有限的知识告诉我,我应该在某个时候释放它。 -
对,你必须释放分配的内存。那么
char *something呢?呵呵,只是为了好奇:P -
我忘记了——我对它和结构做了一个
malloc。mallocstruct,然后 malloc 里面的char*。 -
你应该能够在调用 NewStringUTF 之后释放 mystruct->something 并且能够在调用 NewObject 之后释放 awesomeStruct *。如果你释放 mystruct->mystruct DTOR AND elsewehere 中的某些东西,你可能会遇到“双重释放”问题。
标签: java c memory-leaks java-native-interface