Desidero allocare e deallocare la memoria nel codice non gestito (C++) e le chiamiamo funzioni dal codice gestito (C#). Non so se il seguente codice va bene senza perdite di memoria o no?Assegnazione e deallocazione della memoria nel codice non gestito tramite la piattaforma Invoke (C#)
codice 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);
codice 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;
}
Ciao, perché non hai usato la parola chiave 'out' per il parametro nella funzione freeMemory? – user186246
Perché si chiama CoTaskMemFree()? cosa fa in realtà? – user186246
Perché freeMemory non restituisce un puntatore. CoTaskMemAlloc() è l'allocatore di memoria per COM. Se non c'è modo di indovinare quale heap è stato utilizzato, allora il marshaller indovina l'heap COM. –