Quiero asignar y desasignar memoria en código no administrado (C++) y las llamamos funciones del código administrado (C#). ¿No estoy seguro de si el siguiente código es correcto sin pérdidas de memoria o no?Asignación y desasignación de memoria en código no administrado utilizando la plataforma Invoke (C#)
código C#:
[DllImport("SampleDLL.dll")]
public extern void getString([MarshalAs(UnmanagedType.LPStr)] out String strbuilder);
[DllImport("SampleDLL.dll")]
public extern void freeMemory([MarshalAs(UnmanagedType.LPStr)] out String strBuilder);
....
//call to unmanaged code
getString(out str);
Console.WriteLine(str);
freeMemory(out str);
código C++:
extern void _cdecl getString(char **str)
{
*str = new char[20];
std::string temp = "Hello world";
strncpy(*str,temp.c_str(),temp.length()+1);
}
extern void _cdecl freeMemory(char **str)
{
if(*str)
delete []*str;
*str=NULL;
}
Hola, ¿por qué no usaste la palabra clave 'out' para el parámetro en la función freeMemory? – user186246
Por qué se llama CoTaskMemFree()? ¿Qué es lo que realmente hace? – user186246
Porque freeMemory no devuelve un puntero. CoTaskMemAlloc() es el asignador de memoria para COM. Si no hay forma de adivinar qué montón se usó, el marshaller adivina el montón de COM. –