2012-03-05 63 views
6

JNAメモリリーク

Pointer myVar = new Memory(Pointer.SIZE); 
this.Lib.LoadData(myVar); 
this.someVar = myVar.getPointer(0).getString(0); 

私は私はそれを理解して、メモリリークを抱えている、getPointerは(0)ポインタを作成する必要がありますfinalize()で解放されるべきオブジェクトですが、そうでないようです。

何か不足していますか?これは仕様によるようです...そして、私は上記の関数をC++のリークなしで動かすことができます。

私はリークをテストするためにループ内のJavaコードを呼び出し、私は一時停止を入れてみましたが、手動でGCを呼び出すこともできました。また、この方法でギガバイトに膨らんでしまいます。

私は数日前から頭を打ちましたが、メモリを解放しようとするほど些細なことに巻き込まれてしまいました。私が言うことができる限り、私はその住所を持っていますが、私はそれをどうやって得るのか分かりません。

編集:ネヴァーマインドは、私もそれを延長せずにJNAから手動で自由に行うための方法があるとは思わない

...

答えて

3

... C++ライブラリに

void FreeData(char** myVar) 
{ 
    delete [] *myVar; 
} 
を、この機能を追加し、このJNAコード

Pointer myVar = new Memory(Pointer.SIZE); 
this.Lib.LoadData(myVar); 
this.someVar = myVar.getPointer(0).getString(0); 
this.Lib.FreeData(myVar); 

あなたがC++でメモリを割り当ておよび削除この方法で作ります。

+0

これまでのところ動作しているようですが、データを解放するためにJNAには本当に他の方法はありませんか? : – StrangeWill

+1

JNAは、ネイティブライブラリの単なるラッパーです。ネイティブメモリ、特に直接ネイティブバッファは管理しません。ネイティブライブラリデザイナーが、ライブラリが使用するメモリを割り当てる/割り当てを解除するためのインターフェイスを提供します。 – ecle

+1

JNAにはメモリを解放するための内部メソッドですが、JNAですべて保護されているため、再度実装する必要があります。 – StrangeWill

0

代わりの myVarに=新しい文字[サイズ]

使用

*myVar = malloc(size); 
strncpy(*myVar, str.c_str(), size); 

配列は次のように削除する必要があります。 [] * myVarを削除、

JNAはそれほどのことを知らない。

+1

'strlen(size)'? –

+0

ヘッドアップのおかげで、Niklas、編集。 –

+0

ちょうど速く、まだ漏れています。 : – StrangeWill

1

呼び出し先には割り当てず、呼び出し先には割り当てません。例えば

:あなたは、Javaから呼び出すとき

int LoadData(char* buf, int maxlen) { 
    std:: string str("[Really Long String Here]"); 
    strncpy(buf, str.c_str(), maxlen); 
    if (str.length() < maxlen) 
     return str.length(); 
    return maxlen; 
} 

次に、適切なサイズのbyte[]に渡します。この実装は非常に非効率的である可能性がありますが、一般的に、あるコンテキストでメモリを割り当て、別のコンテキストでメモリを割り当てたくないという考えがあります。

+1

実装では、char * bufは10バイト、10k、または150kにすることができます。フルコードを実装すると、数メグを割り当てて非効率的な実装をするだけでなく、 – StrangeWill

+0

呼び出し先にストレージを管理させたい場合は、 "const char *"を返すことができます; JNAはその内容をJava Stringにコピーします。バッファの内容を変更したり、削除したりすることは安全です。ポインタを返すと、Java側が実際にデータを参照する必要があるまで、メモリコピーを回避できます。それを行う「正しい」方法は、プログラムのどの部分(Javaまたはネイティブ)がデータにアクセスする必要があるか、頻度、およびバッファの存続期間に大きく依存します。 – technomage