Ho scritto un metodo di supporto,Se alloco memoria con AllocHGlobal, devo liberarlo con FreeHGlobal?
internal static IntPtr StructToPtr(object obj)
{
var ptr = Marshal.AllocHGlobal(Marshal.SizeOf(obj));
Marshal.StructureToPtr(obj, ptr, false);
return ptr;
}
che prende un struct
e mi restituisce un IntPtr
ad esso. Io lo uso come tale:
public int Copy(Texture texture, Rect srcrect, Rect dstrect)
{
return SDL.RenderCopy(_ptr, texture._ptr, Util.StructToPtr(srcrect), Util.StructToPtr(dstrect));
}
Il problema è che ho solo bisogno che IntPtr
per una frazione di secondo in modo che possa farlo passare alla DLL C,
[DllImport("SDL2.dll", CallingConvention = CallingConvention.Cdecl, EntryPoint = "SDL_RenderCopy")]
internal static extern int RenderCopy(IntPtr renderer, IntPtr texture, IntPtr srcrect, IntPtr dstrect);
io in realtà non voglio preoccuparti di liberarlo; altrimenti la mia funzione a 1 riga diventa 6:
public int Copy(Texture texture, Rect? srcrect=null, Rect? dstrect=null)
{
var srcptr = Util.StructToPtr(srcrect);
var dstptr = Util.StructToPtr(dstrect);
var result = SDL.RenderCopy(_ptr, texture._ptr, srcptr, dstptr);
Marshal.FreeHGlobal(srcptr);
Marshal.FreeHGlobal(dstptr);
return result;
}
C'è un modo migliore per farlo? C# alla fine pulirà tutta la memoria che ha allocato?
In caso contrario, c'è un modo posso avvolgere la chiamata a SDL.RenderCopy
in alcune dichiarazioni using
invece in modo che io non devo fare tutto questo variabile temporanea + esplicito liberando non-senso?
+1 L'unica cosa che farebbe meglio questo è una conversione 'implicita' in' IntPtr' in modo che potesse essere passata alla sua chiamata API senza la necessità di '.Ptr'. –
+1 anche su questo, e anche +1 sulla conversione implicita, –
, ma se dovessi farlo solo con questa funzione, non lo presenterei. Perché se seguo ciò che stai facendo, lo vuoi il più scattante possibile –