2017-01-24 5 views
1

Kurze Frage wollte ich fragen, ich habe eine Direct2D Fabrik und wenn ich bereit zu bereinigen bin immer würde ich löschen anrufen oder Verwendung Release-Mitglied? Ich sehe einige Tutorials, die nur explizit aufrufen löschen, so war ich gespannt, was sicherer ist, wenn nicht alle das Freigabeelement tut, ist Anruf im Hintergrund löschen etc.`Windows COM C++ - Mit löschen oder Release

Graphics::~Graphics() { 

    if (Factory) //Factory->Release(); or delete Factory; 
    if (Render) //Render->Release(); or delete Render; 
} 

Antwort

4

Der richtige Weg, COM-Schnittstellen zu lösen ist die Release Methode auf dem Interface-Zeiger aufzurufen.

delete ist für C++ - Objekte mit new auf dem Heap zugeordnet, nicht für COM-Schnittstellenzeiger.

Beachten Sie, dass Sie auch sicher roh COM-Schnittstelle Zeiger Smart-Pointer-Klassen wie ATL CComPtr wickeln können. In diesem Fall wird das Verfahren Release automatisch aufgerufen, wenn der Smart Pointer den Gültigkeitsbereich verlässt.

Zum Beispiel, wenn Sie Smart-Pointer-Wrapper verwenden für die Factory und Render Datenelemente in Ihrem Beispiel, gibt es keine Notwendigkeit, explizit Release im Graphics destructor zu nennen: Die C++ Compiler automatisch Aufruf der Destruktoren auf jedes Datenelement , was dazu führt, dass Release für die gewickelten COM-Schnittstellen aufgerufen wird.

0

natürlich Release(); und dies nur auf Interface-Methode. und Sie können delete nur für Speicher aufrufen, den Sie zuvor durch eigene new zugewiesen haben. immer Fehler delete von externen DLL zugewiesen für Speicher aufrufen, da sie neu/löschen können Ihren neuen nicht übereinstimmen/löschen

+0

„Fehler löschen rufen immer für Speicher von einem externen DLL zugewiesen, weil sie neu/löschen nicht Ihr neues bieten kann/löschen“ ist nicht ganz richtig. Es ist möglich, dass zwei oder mehr Windows-Module dieselbe Instanz derselben Laufzeitbibliothek verwenden, nämlich mit der Laufzeitbibliothek als DLL. Es ist auch möglich, eine klassenspezifische Zuweisung und Freigabe zu definieren, bei der der richtige instanzspezifische Speichermanager verwendet wird. –

+0

@ Cheersandhth.-Alf - natürlich durchaus möglich, dass 2 verschiedene 'pe' Module die gleiche Implementierung von' new/delete' haben - so wird dieses Formal bearbeitet, aber Event wird in diesem Fall ein logischer Fehler sein. – RbMm

+0

Nein, es gibt keinen logischen Fehler, wenn Sie etwas tun, das für den von Ihnen kontrollierten Code völlig in Ordnung ist. –

Verwandte Themen