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: '(

Était-ce utile?

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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top