Domanda

Recentemente ho visto un paio di progetti open source che in realtà fanno questo; restituire un puntatore non sicuro da una funzione come: "int * input = this.someIterator.GetUnsafePtr ()".

Dalla mia comprensione questo deve essere completamente sbagliato. puntatori non sicuri possono essere ottenuti solo attraverso le dichiarazioni 'fisse' e sicuramente quelli restituiti all'interno di una funzione non sarà più riposte (si 'perdono' la loro portata dichiarante), causando loro di essere finalmente garbage collection.

Ma poi non mi ricordo il compilatore dare alcun avvertimento su questa operazione, quindi perché preoccuparsi di utilizzare un'istruzione fisso, se si può effettivamente avere 'appuntati' puntatori diffuso in tutto?

È stato utile?

Soluzione

Non ho mai visto tali costruzioni in progetti open source. Sarà meglio se si fornisce alcuni esempi di tale uso nella sua interrogazione. Significato si può dipende dal comportamento.
Ma io sono d'accordo, i puntatori non sicuri sono il male e devono essere utilizzati solo quando si interagisce con alcune librerie o codice nativo.
Per quanto mi ricordo è possibile utilizzare questa costruzione solo in blocco non sicuro. Quindi penso che il compilatore non darà alcun avvertimento qui. E IMO è meglio usare IntPtr (blocchi non sicuri possono essere eseguiti solo in full-trust).
EDIT:
@Stephen è giusto, IntPtr non manterrà riferimento all'oggetto sulla raccolta GC.

Altri suggerimenti

Che ne dite, Marshal.AllocHGlobal o Marshal.AllocCoTaskMem, entrambi di ritorno IntPtr, che possono essere liberamente cast void * utilizzando la funzione .ToPointer()?

o il puntatore può provenire da codice non gestito. È necessario fix/pin memoria perché la memoria è gestita, da qui fino a quando non è fixed/pinned il garbage collector è libero di muoversi esso, rendendo il puntatore non valido.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top