Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/124.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++模板类导致无限循环破坏_C++_C++11 - Fatal编程技术网

C++模板类导致无限循环破坏

C++模板类导致无限循环破坏,c++,c++11,C++,C++11,所以,我有基类和带模板的派生类 它工作正常,直到我尝试删除派生类。 我测试了将派生类作为一个整体生成,或者不使用模板生成,它工作得很好,但当我将其拆分为.h和.cpp文件时,会出现错误 这个很好用 template<class T> class NodeTT: public Node { private: T _data; public: NodeTT(Node* parent = nullptr):Node(paren

所以,我有基类和带模板的派生类 它工作正常,直到我尝试删除派生类。 我测试了将派生类作为一个整体生成,或者不使用模板生成,它工作得很好,但当我将其拆分为.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();
}
在输出中,我得到了无限的消息base destr,因此任何帮助我指出错误的人都将不胜感激


对不起,我的英语不好。

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

你的错误是在你的问题中包含了随机的代码位,而这些代码位不能满足问题的要求。这是不可能的,你把你的帖子,编译它,并复制问题。不一定与你的问题有关,但考虑有一个虚拟析构函数…删除看起来很可疑。@AlexG-我们没有看到基类节点。很可能是这样。瓦西里,按照山姆的要求去做,然后发一篇文章。很难看出将代码拆分成不同的文件是如何导致这种情况的。假设它可能是所有UB的一个奇怪的人工制品。该死,这真的是个问题,我怎么可能没有注意到呢?现在我很尴尬xD@Vasily-没什么好尴尬的。我之所以认识到这一点,是因为我在自己的代码中花了太多时间调试递归析构函数调用。