2011-01-10 3 views
5

Ich weiß, dass, wenn Ihre DLL statische Verknüpfungen mit einer anderen Version der Laufzeit, dann erstellt es einen eigenen Heap. Es wird auch, wenn es angewiesen wird, einen Haufen zu machen. Unter diesen Umständen ist es für die DLL nicht sicher, was die zugewiesene exe löscht. In welchen Fällen gilt dies NICHT (wie in, es ist sicher für die DLL zu löschen, was die exe zugewiesen)? Ist es sicher, wenn sowohl die exe als auch die DLL statisch mit derselben Laufzeitbibliothek verknüpft sind?Wann genau würde eine DLL einen anderen Heap als die ausführbare Datei verwenden?

Dank

im Grunde ist es eine Möglichkeit, wo wer es nur addEvent(new DerivedEvent(), FunctorDestroyClass());

+0

Nein. Deshalb verknüpfen Sie dynamisch mit der Runtime. Dies ist das Standardverhalten (dynamische Verknüpfung) und die einzige von MS empfohlene Methode. Die statische Verknüpfung der Laufzeit verursacht nur Kopfschmerzen. Tu es einfach nicht. –

Antwort

2

ich mehr in Frage sein kann lesen, als es ist, aber wenn Sie wissen wollen, sind, wie Sie und freien Speicher über DLL Grenzen zuweisen kann, dann könnten Sie so etwas wie die folgenden verwenden:

#define DLLMemAlloc(size) HeapAlloc(GetProcessHeap(), 0, size) 
#define DLLMemFree(mem) HeapFree(GetProcessHeap(), 0, mem) 

Das könnte sicherer sein (ein partieller Versuch der Zukunftssicherung). Sich auf verschiedene Build-Optionen zu verlassen, um die Sicherheit des Zuweisens und Freigebens über Grenzen hinweg zu gewährleisten, könnte zu Problemen führen.

Und (auch nicht Teil der Frage), könnten Sie darüber nachdenken, ob es wirklich notwendig ist, dies zu tun. Es scheint, als könnte es einen Konstruktionsfehler geben, wenn eine DLL etwas zuweisen muss, das eine andere DLL (oder ausführbare Datei) freigibt.

+0

Es ist, weil ich polymorphe zeitgesteuerte Ereignisse machen möchte, also gibt es keine Fabrikweise, dies zu tun, und wenn der Benutzer keine Möglichkeit hat, Zeit zu verfolgen, werden sie nicht wissen, wann man es befreien muss, weshalb die DLL auch braucht. – jmasterx

+1

Ich stimme zu. Ich glaube nicht, dass du auf der einen Seite und auf der anderen Seite frei und gut schlafen kannst, auch wenn es in dem Moment gut geht, in dem es dich eines Tages in den Arsch beißt. –

+0

@Milo DLL kann eine Bereinigungsschnittstelle verfügbar machen, und EXE kann es verwenden, um frei zu sein, anstatt nur einen free() -Aufruf zu verwenden. –

0

DLL seinen eigenen Speicher-Manager erhalten tun könnte zuordnet, wenn Sie statisch Laufzeitbibliothek verknüpfen. Sie haben 3 Optionen: Laufzeit dynamisch verknüpfen, immer an derselben Stelle zuweisen und freigeben (entweder DLL oder ausführbare Datei, falls erforderlich Weiterleitung), oder Speicherzuordner von Drittanbietern verwenden, der sich um dieses Problem kümmert.

+0

Also, wenn die DLL dynamisch mit der Laufzeit von MSVCR80.DLL verknüpft, dann die Exe Links zu MSVCRT90.DLL dynamisch, Theres kein Problem? – jmasterx

+0

Es gibt definitiv, wenn sie nicht die gleiche Version sind. Sie sollten sich nicht darauf verlassen, dass zwei Module denselben Heapspeicher haben. – Puppy

+1

@Milo sollte es kein Problem sein, es sei denn, Sie versuchen, auf der einen Seite und kostenlos auf der anderen Seite zuzuweisen, aber ich habe es selbst nicht versucht (tm). –

Verwandte Themen