C++模板类导致无限循环破坏
所以,我有基类和带模板的派生类 它工作正常,直到我尝试删除派生类。 我测试了将派生类作为一个整体生成,或者不使用模板生成,它工作得很好,但当我将其拆分为.h和.cpp文件时,会出现错误 这个很好用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
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-没什么好尴尬的。我之所以认识到这一点,是因为我在自己的代码中花了太多时间调试递归析构函数调用。