2017-07-13 9 views
-1

したがって、基底クラスと派生クラスのテンプレートを使用しています 派生クラスを削除しようとするまで、うまく動作します。 私は、またはテンプレートなしでワンピースとして派生クラスを作りテストし、それがうまく働いたが、私はそれを分割する際にこれがC++のテンプレートクラスは、破棄時に無限ループを引き起こします

template<class T> 
    class NodeTT: public Node 
    { 
    private: 
     T _data; 
    public: 
     NodeTT(Node* parent = nullptr):Node(parent){} 
     NodeTT(T data, Node* parent = nullptr):Node(parent),_data(data){} 
     ~NodeTT(){std::cout<<"deriv destr"<<std::endl;} 
     void show(){ 
      std::cout<<_data<<std::endl; 
      for(Node* childNode : _children)childNode->show(); 
     } 
    }; 

同じ正常に動作します

.Hとの.cppファイル私は取得していますエラーのために二つのファイル

HEADER 
#include <iostream> 
#include <node.h> 

template<class T> 
class TNode: public Node 
{ 
private: 
    T _data; 
public: 
    TNode(Node* parent = nullptr); 
    TNode(T data, Node* parent = nullptr); 
    ~TNode(); 
    void show(); 
}; 

SOURCE 
template<class T> 
TNode<T>::TNode(Node *parent) : Node(parent){} 

template<class T> 
TNode<T>::TNode(T data, Node* parent): Node(parent),_data(data){} 

template<class T> 
TNode<T>::~TNode(){ 
    std::cout<<"deriv destr"<<std::endl; 
} 

template<class T> 
void TNode<T>::show(){ 
    std::cout<<_data<<std::endl; 
    for(Node* childNode : _children)childNode->show(); 
} 

template class TNode<int>; 
template class TNode<float>; 
template class TNode<std::string>; 

におけるクラスと基底クラスのデストラクタこの

Node::~Node(){ 
    std::cout<<"base destr"<<std::endl; 
    for(Node* childNode : _children) 
    { 
     delete childNode; 
    } 
    delete _parentNode; 
    _children.clear(); 
} 

の出力に無限のメッセージ "base destr"が表示されるので、間違いを指摘する助けとなります。

私の英語のために申し訳ありません。

+4

あなたの間違いは、[mcve]の要件を満たしていない、あなたの質問にランダムなビットのコードを含むことです。投稿したものを取り出してコンパイルし、問題を再現することはできません。 –

+5

必ずしもあなたの問題に関連しているわけではありませんが、仮想デストラクタを持つことを検討してください... – AlexG

+7

'delete _parentNode;' - それは非常に疑わしいです。 –

答えて

5

まだという完全な問題をコンパイル、実行、および表示するプログラムを提供していません。しかしdelete _parentNode;は間違っています。これがノードの階層である場合、子ノードのデストラクタを呼び出すと、親ノードはすでにが破棄されているです。それらの子ノードを削除すると、その親ノードは再び親を破棄しようとします。これにより、すでに破棄されている子ノードをすべて破棄しようとします。それはあなたに厄介なループを与えます。

+0

まあ、それは本当に問題でした、どうすればこのことに気付かないでしょうか?今私は恥ずかしいですxD – Vasily

+0

@Vasily - 何も恥ずかしいことはありません。自分のコードで再帰的なデストラクタ呼び出しをデバッグするのにあまりにも多くの時間を費やしたので、私はそれを認識しました。 –

関連する問題