我正在使用访问者模式的中型C++框架。这些访问方法为什么导致内存泄漏?
执行此框架的程序的valgrind测试报告了大量内存泄漏,可以追踪到其中一个访问者,即copyCreator
。
template<typename copyNodeType>
struct copyCreator {
copyCreator {}
copyCreator(node * firstVisit) {
firstVisit->accept(*this);
}
~copyCreator() {
copy.reset();
for(auto ptr : openList) {
delete ptr;
}
}
std::unique_ptr<copyNodeType> copy = 0;
vector<nonterminalNode *> openList;
// push to tree
template<typename nodeType>
void push(nodeType * ptr) {
if (copy) {
// if root is set, append to tree
openList.back()->add_child(ptr);
}
else {
auto temp = dynamic_cast<copyNodeType *>(ptr);
if(temp) {
copy = std::unique_ptr<copyNodeType>(temp);
}
}
}
// ...
void visit(struct someNonterminalNode & nod) {
auto next = new someNonterminalNode(); //This is leaked
push(next);
openList.push_back(next);
nod.child->accept(*this);
openList.pop_back();
};
有,为什么我感到困惑的这两个主要的原因:
- 两个不同的构造导致不同数量的泄漏
- 泄漏报告访问期间发生
所有节点的accept
方法只是简单地触发正确访问者的visit
方法的标准双重调度。
我对C++编程相当陌生,可能忽略了一些真正的基本问题。
我可以看到为什么'copyCreator cpy2(&globalScope,a);'会泄漏。 'copyCreator '预计它访问的第一个节点的类型是'T'。它创建并立即泄漏所有其他节点类型,直到遇到它的第一个“T”。但'a'不是'programNode'。 –