Frage

Sprache: C ++

Plattform: Windows Server 2003

ich eine exe haben eine DLL aufrufen.

EDIT: (Exe nichts tut, nennt es einige globale Funktion, die alles DLL innerhalb DLL im Zusammenhang der Fall ist. Es ist nicht explizit neue alle DLL-Klassen)

I zuteilen ( neue ) der Speicher für Klasse A in der DLL, es gibt mir eine nicht-lokalen Heapzeiger .

Ich habe versucht, neue andere Klassen innerhalb der DLL (die in DLL sind), "neue" gibt einen gültigen Heapzeiger für sie, seine nur Klasse A , das ist nicht richtig zugeordnet werden.

Ich bin an Fenstern und den Heap von diesem Funktionsaufruf Validierung:

EDIT:

 ClassA* pA = new ClassA(); 

 _CrtIsValidHeapPointer ( (const void *) pA )

Ich bin ernsthaft verwirrt, warum nur das geschieht mit neuer -ing Klasse A und keine anderen Klasse?

(Alle systemeigenen Code)

FINAL EDIT:
es stellte sich heraus, ein schlechter gebaut werden. kann nicht es in den neuen ... verschwendet 5 Tage auf diese zu reproduzieren: '(

War es hilfreich?

Lösung

Export nur globale Funktionen aus DLLs und Aufruf nur exportierten Funktionen und durch v-Tabellen. Ihr Problem ist nur einer von vielen, die durch versuchen, ganze Klassen zu exportieren. DLLs sind nicht das gleiche wie .so Bibliotheken.

EDIT:. Da die Frage zeigt nun, dass die Klasse nicht exportiert wird, aber all dies ist innerhalb der einzelnen DLL beobachtet, gehen andere mögliche Ursachen dafür,

Ist der gleiche Zeiger von new zurück getestet, oder es könnte ein Zeiger auf eine Basisunterobjekt sein? Hat die Zuteilung Verwendung new oder new []? Beides könnte den Zeiger auf Punkt in die Mitte eines Heap-Blöcke anstelle des Starts führen.

Andere Tipps

Wenn Class A Überschreibungen operator new dann der Speicher für diese Klasse konnte in dem DLL Kopie der C-Laufzeit zugeordnet werden. Dies würde _CrtIsValidHeapPointer zu Rückkehr false führen. - da Ihre Version der C-Laufzeitbibliothek ist ein anderen Haufen als die in der DLL mit

Der Wert von _CrtIsValidHeapPointer zurückgegeben wird, ist im Allgemeinen nicht zuverlässig sowieso (natürlich, auch wenn es TRUE zurückgeben kann es nicht unbedingt, dass Sie können Verwendung der Zeiger). Warum tun Sie das eigentlich?

Vielleicht ist die Klasse deklariert seinen eigenen Betreiber neu, dass get Lagerung von einem Geheimnis Standort?

z. Der Autor der Klasse geschrieben hat:

class MyClass {
   public:
     void * operator new (size_t amt);
     void operator delete(void *);
};

Dann deren Betreiber neue schlägt Ihr Betreiber neu.

Entweder das, oder die DLL mit / MTd während der ausführbaren Anwendungen / MD gebaut wird.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top