Operator „new“ für nur eine Klasse eines nicht-lokale Heapzeiger Rückkehr?
-
26-09-2019 - |
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: '(
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.