Сигурно пропускам нещо. Четох за 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 справя ли се с това? Какво ми липсва тук?
Благодаря предварително.