Est-il possible de redéfinir le destructeur?

J’ai rencontré un problème de “redéfinition” du destructeur. La chose est que j’ai reçu une définition de struct que je ne peux pas modifier. C’est une “feuille” d’un arbre. L’objective est de libérer seulement une partie de l’arbre tout en renvoyant un pointeur sur le sous-arbre restant Mon idée est d’utiliser le comptage de références. C’est le code donné:

struct TLeaf { TLeaf* m_L; TLeaf* m_R; ~TLeaf(void) { delete m_L; delete m_R; } } 

Y a-t-il au moins moyen d’éviter d’appeler ce destructeur? En fait, toute idée est acceptable. :RÉ

Merci beaucoup les bonnes personnes de Stack Overflow. 🙂

Vous pouvez nullptr les valeurs avant de supprimer le nœud. delete ptrptr est nullptr est sûr et ne fait rien

 TLeaf* ltmp = node->m_L; TLeaf* rtmp = node->m_R; node->m_L = nullptr; node->m_R = nullptr; delete node; // now use ltmp and rtmp as you need 

Comme vous ne pouvez pas modifier le TLeaf, vous pouvez modifier le code utilisateur.

0) Si vous utilisez l’allocation de tas, essayez l’ operator delete(p) au lieu de delete p .

1) Si vous utilisez l’allocation de stack, évitez d’utiliser directement le type TLeaf :

 char leaf[sizeof(TLeaf)]; new (leaf) TLeaf(...); // placement new