2013-01-22 12 views
6

Ho un metodo esterno che riceve alcuni parametri, alloca la memoria e restituisce un puntatore.Come bloccare un puntatore "non gestito"?

[DllImport("some.dll", CallingConvention = CvInvoke.CvCallingConvention)] 
public static extern IntPtr cvCreateHeader(
     Size size, 
     int a, 
     int b); 

Sono ben consapevole che si tratta di una cattiva pratica di allocare memoria non gestita in un'applicazione gestita, ma in questo caso non ho scelta come la dll è 3rd party.

c'è una funzione equivalente che rilascia la memoria e so qual è la dimensione dell'array allocato.

  1. Come si collega il puntatore restituito in modo che il GC non lo sposti (senza andare pericoloso)? 'fixed' non lo farà perché questo puntatore è ampiamente utilizzato in tutta la classe?
  2. Esiste un metodo migliore per questo p/Invoke?
+1

Perché sarebbe un puntatore mossa non gestito (indirizzo cambiamento IOW)? Penso che la tua comprensione sia sbagliata. La correzione è necessaria solo quando si utilizzano oggetti gestiti nel codice non gestito. – leppie

+0

GC si muove oggetti gestiti (puntatori) nella sua ottimizzazione (defrag) operazione. – Gilad

+1

Bene, non stai usando i puntatori gestiti. – leppie

risposta

11

No, si stanno ottenendo di nuovo un puntatore alla memoria che mai mossa. La memoria allocata da un heap nativo rimane ferma, non c'è nulla di simile alla strategia di compattazione che un garbage collector usa. Questo può funzionare solo quando un sistema di gestione della memoria può trovare tutti i puntatori che puntano a un blocco di memoria assegnato. In modo che possa aggiornare quei puntatori quando si muove il blocco. Nulla di simile esiste per il codice nativo, non esiste un modo affidabile per rintracciare quei puntatori.

Non è necessario cercare un modo per appuntare il puntatore. Non ce n'è uno perché non ce n'è bisogno.

+0

Hans, aggiorni la pagina di tag "p-invoke" ogni cinque minuti o così, ho ragione? :) – JerKimball

+2

No, non proprio. Il motore SO spinge queste domande sulla mia prima pagina in base alle risposte precedenti. Immagino di essere condannato a rispondere per sempre a domande di Pinvoke;) –

+1

http://uploads8.wikipaintings.org/images/titian/sisyphus-1549.jpg – JerKimball

Problemi correlati