C ++模板类在销毁时导致无限循环

时间:2017-07-13 12:32:59

标签: c++ c++11

所以,我有基类和带有模板的派生类 它工作正常,直到我尝试删除派生类。 我测试将派生类作为一个部分,或没有模板,它工作正常,但当我将它拆分为.h和.cpp文件时,我得到错误

这很好用

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();
        }
    };

两个文件中的相同类

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();
}

在输出中我得到了无限的消息&#34; base destr&#34;,所以任何帮助指出我的错误都将受到赞赏

抱歉我的英文。

1 个答案:

答案 0 :(得分:5)

您仍未提供编译,运行和显示问题的完整程序。但delete _parentNode;看起来不对劲。如果这是节点的层次结构,则父节点在调用子节点的析构函数时已被销毁。让这些子节点删除该父节点再次尝试销毁父节点,这反过来会尝试销毁所有已经被销毁的子节点。那会给你一个讨厌的循环。