Je rencontre des problèmes avec une bibliothèque liée dynamiquement qui appelle mon opérateur surchargé mais pas mon opérateur new. Mon exe ressemble à quelque chose comme ceci:Opérateur incohérent new/delete calling
class A {
public:
void func() {
t = dynLib::Type::CreateObject();
}
dynLib::Type t;
};
void main() {
A a;
a.func();
}
Et puis j'ai une bibliothèque liée statiquement où j'ai mes opérateurs mondiaux surchargées et la bibliothèque liée dynamiquement la cause du problème. Fondamentalement, ce qui se passe est que le type dynLib :: Type contient un vecteur std :: auquel il ajoute un élément dans son constructeur. Ainsi, le type ressemble à ceci
class Type {
public:
Type() {
v.push_back(T());
}
std::vector<T> v;
};
Quand func() est appelée, une nouvelle instance de type est créé, passé par valeur, puis affecté à t. L'opérateur = dans le travail copie sur le vecteur std :: aussi par son opérateur =. Ceci à son tour appelle deallocate sur l'ancien std :: vector en t, car il avait déjà un élément ajouté dans son constructeur. Cet appel deallocate finit par appeler mon opérateur delete. Le problème est que mon opérateur new n'a jamais été appelé, donc il supprime un pointeur dans un espace mémoire complètement différent (l'enregistrement de la mémoire le montre).
Maintenant, il me manque probablement quelque chose. Comme la classe A ci-dessus contient un objet dynLib :: Type, il peut être construit avant que mon opérateur new (à partir de la bibliothèque statique) ne soit lié. Est-ce que c'est possible? Je ne suis pas sûr à quel point le constructeur du composé dynLib :: Type est appelé. La bibliothèque dynamique utilise les allocateurs stl par défaut pour ne rien faire de funky.
J'ai essayé de recréer la même situation sans la bibliothèque dynamiquement liée, juste en ayant la classe Type dans mon exe. Cela ne provoque pas le problème si bien que cela me porte à croire qu'il doit avoir quelque chose à voir avec l'ordre de lien.
La bibliothèque et mon exe utilisent le CRT dynamique. Et ce qui m'intéresse le plus, c'est pourquoi utilise-t-il seulement mon opérateur delete et pas nouveau? Quand j'appelle func() ci-dessus, la fonction CreateObject() est dans la DLL, ne devrait-elle pas utiliser sa propre nouvelle/supprimer? –
Mais ensuite il est assigné à 't' qui se trouve dans l'exécutable, donc il cals l'opérateur' new' qui se trouve dans l'exécutable. En théorie, cela devrait fonctionner, mais ce n'est pas le cas. C'est un problème courant: http://stackoverflow.com/questions/1085873/dll-memory-manager-mixup –