opérateur « nouveau » retournant un pointeur de tas non local pour une seule classe?
-
26-09-2019 - |
Question
Langue: C ++
Plate-forme: Windows Server 2003
J'ai un exe appeler une DLL.
EDIT: (Exe ne fait rien, il appelle quelques fonction globale qui fait tout ce qui concerne DLL dans les DLL. Il n'a pas explicitement nouveau l'une des classes DLL)
J'allouer ( nouveau ) pour la mémoire classe A dans la DLL, il me renvoie un pointeur non local tas .
J'ai essayé de nouveau d'autres classes dans la DLL (qui sont en DLL), "nouveau" renvoie un pointeur de tas valide pour eux, son seul Classe A qui est pas alloué correctement.
Je suis sur les fenêtres et de valider le tas par cet appel de fonction:
EDIT:
ClassA* pA = new ClassA();
_CrtIsValidHeapPointer ( (const void *) pA )
Je suis sérieusement confus pourquoi cela se produit uniquement avec nouveau -ing Classe A et aucune autre classe?
(Tout code natif)
FINAL EDIT: il est avéré être une mauvaise construction. ne peuvent pas obtenir de reproduire dans le nouveau ... perdu 5 jours à ce sujet: '(
La solution
Exporter uniquement les fonctions globales de DLL et appeler uniquement les fonctions exportées et par v-tables. Votre problème est que l'un des nombreux causés en essayant d'exporter des classes entières. DLL ne sont pas les mêmes que .so bibliothèques.
EDIT:. Puisque la question révèle maintenant que la classe n'est pas exportée, mais tout cela est observé à l'intérieur de la DLL unique, va suggérer d'autres causes possibles
est le même pointeur de retour new
testé, ou pourrait-il être un pointeur vers un sous-objet de base? Est-ce que l'utilisation ou l'allocation new
new []
? Chacune de ces pourrait provoquer le pointeur à point dans le milieu d'un bloc de tas au lieu du début.
Autres conseils
Si Class A
operator new
alors la overrides mémoire pour cette classe pourrait être attribuée dans la copie du runtime C de la DLL. Cela causerait _CrtIsValidHeapPointer
pour revenir false
-. Parce que votre version de la bibliothèque d'exécution C utilise un tas différent de celui dans la DLL
La valeur retournée par _CrtIsValidHeapPointer
est généralement pas fiable de toute façon (sans aucun doute, même si elle peut revenir Vrai, il ne signifie pas nécessairement que vous pouvez utiliser le pointeur). Pourquoi faites-vous cela de toute façon?
Peut-être la classe déclare son propre opérateur nouveau qui se stockage à partir un emplacement de mystère?
par exemple. L'auteur de la classe peut avoir écrit:
class MyClass {
public:
void * operator new (size_t amt);
void operator delete(void *);
};
Alors, leur opérateur de nouveaux beats votre nouvel opérateur.
Ou bien la DLL est construite avec / MTd tandis que l'exécutable utilise / MD.