2013-05-13 9 views
6

Ich konvertiere eine verwaltete System.Action in eine nicht verwaltete std :: -Funktion in einem C++/CLI-Projekt; sollte ich das angegebene IntPtr nach der Verwendung des Callbacks freigeben oder ist es unnötig?Marshal :: GetFunctionPointerForDelegate: Soll ich das Ergebnis freigeben?

void MyClass::Execute(System::Action^ callback) 
{   

    IntPtr callbackPtr = Marshal::GetFunctionPointerForDelegate(callback); 
    std::function<void (void)> nativeCallback = static_cast<void (__stdcall *) (void)>(callbackPtr.ToPointer()); 

    m_nativeObject->Execute(wrappedCallback); 

    // should I release callbackPtr here? 
} 

Antwort

6

Nein, es gibt keine Methode Marshal-Klasse, dies zu tun. Wie der gesamte dynamisch generierte Code ist der von dieser Methode erstellte Thunk der AppDomain zugeordnet und wird entladen, wenn die AppDomain entladen wird.

Beachten Sie, dass dies für das Delegat-Objekt nicht der Fall ist. Es unterliegt den normalen Regeln für die Speicherbereinigung. Und Sie müssen vorsichtig sein, das Thunk tut nicht halten Sie es am Leben. Was ist ein Fehler in Ihrem Code, kann der Delegat gesammelt werden, während der native Code ausgelastet ist. Sie müssen diese Codezeilen bis zum Ende des Verfahrens hinzuzufügen:

GC::KeepAlive(callback); 

Mit der Annahme, dass der Rückruf nur so lange gemacht werden, wie die Methode execute() ausgeführt wird. Wenn der nicht verwaltete Code den Funktionszeiger über diesen Methodenaufruf hinaus speichert, müssen Sie das Delegatobjekt irgendwo speichern, um es gültig zu halten.

+0

auch wenn m_nativeObject-> Execute (wrappedCallback) synchron ist? – Notoriousxl

+5

Ein Thread wird Ihren Tag ruinieren. Naja, Woche. –

2

Sie müssen den Zeiger nicht loslassen. Sie haben bereits Ihren Zeiger auf die Funktion (das ist eine 32/64-Bit-Größe abhängig von Ihrer Maschinenarchitektur). Wenn die .net-Framework-Infrastruktur mehr benötigt, um den Zeiger auszuführen, wäre sie für alle Methoden gleich, so dass sie statisch zugewiesen wäre (kein Status).

Verwandte Themen