[c++] new écrit à une adresse existante !?!
Bonsoir à tous !
Je me suis remis au C++ histoire de me décrasser (j'ai fait du LUA pendant 9 mois :roll: ), et la ca fait 2h que je me prends la tête sur un problème...
En fait je me suis fixé comme but de faire une appli en C++/wxWidgets permettant de dessiner des plans d'appartement. Je commence doucement, avec murs et "nodes" points de ralliement des murs (un mur a donc une node de départ, et une d'arrivée).
Tout va bien, mais la, j'ai fait en sorte que clic du bouton milieu sur un mur le divise en deux. Et parfois ca fait n'imp ! Jme suis demandé d'où venait l'erreur dans mon code, mais à force de pas trouver, me suis décider à afficher les adresses des différents nodes et murs (pour l'instant un seul mur que je divise).
Et la, SURPRISE !!! Je me rends compte que la nouvelle node que je crée pour définir le point milieu du mur est en fait allouée par new à la place d'une des deux nodes existantes !!! :aie:
Voici mon code :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13
|
ADNode* ADNode::getCenter(ADNode *begin, ADNode *end)
{
assert(begin != NULL);
assert(end != NULL);
std::cout << "Get center of " << *begin << " and " << *end << std::endl;
int x = (begin->getX() + end->getX()) / 2;
int y = (begin->getY() + end->getY()) / 2;
ADNode *center = new ADNode(x, y);
std::cout << "Found : " << *center << std::endl;
return center;
} |
Et voici le résultat obtenu dans la console :
Code:
1 2 3 4
|
Get center of (0x1031b70) (10, 30) and (0x1031bb0) (210, 30)
[NEW NODE] (0x1031b70) (110,30) 1 nodes total
Found : (0x1031b70) (110, 30) |
(les premières parenthèses sont bien sur l'adresse du pointeur, et les suivantes sont le point mathématique).
On remarque bien qu'il crée la nouvelle node à la place d'une existante ! Jme disais bien, aussi : pour mes classes j'ai un compteur d'instances, et à la fin du programme quand j'ai tout nettoyé, j'affiche ce compteur pour être sûr de rien avoir oublié. Et parfois il est NEGATIF pour les nodes, et parfois positif... Trop bizarre cette histoire !
Evidemment, hors de question d'utiliser le placement new. Quelqu'un saurait pourquoi new m'écrase une zone précédemment allouée ?
Merci beaucoup de votre aide les roxxors ! :yaisse2:
Bonne soirée à tous !
Lideln