私は何かが欠けているに違いありません。私はFFIについて読んでいますが、これについて明確な答えを得ることができないようです。次のC++関数があるとしましょう。
extern "C" {
int ReturnAnArrayOfStrings(const char* arrayOfStrings[]) {
if( NULL == arrayOfStrings ) return someCharList.size();
for(auto iter = someCharList.begin(), auto index = 0; iter != someCharList.end(); ++iter, ++index) {
char* allocatedHere = new char[strlen(*iter)]; // note that this is not freed
strcpy_s(allocatedHere, strlen(*iter), *iter);
arrayOfStrings[index] = allocatedHere;
}
return someCharList.size();
}
}
私の知る限り、FFIからこれを使用する場合、あなたがしなければならないのは次のことだけです。
module SomeDll
extend FFI::Library
ffi_lib 'SomeDll.dll'
attach_function :get_strings, :ReturnAnArrayOfStrings, [:pointer], :int
end
include SomeDll
pointer = FFI::MemoryPointer.new :pointer, get_strings(nil) # how many strings are there?
get_strings pointer
pointer.get_array_of_string(0).each do |value|
puts value
end
私の質問はこれです:誰がメモリをクリーンアップしますか?C ++メソッドはnew
、char *を起動していますが、解放することはありません。FFIはこれを処理しますか?ここで何が欠けていますか?
前もって感謝します。