gpt4 book ai didi

c++ - 为什么这些访问方式会导致内存泄漏呢?

转载 作者:搜寻专家 更新时间:2023-10-31 02:10:25 25 4
gpt4 key购买 nike

我正在开发一个使用访问者模式的中型 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 方法的标准双重分派(dispatch)。

我是 C++ 编程的新手,可能忽略了一些非常基本的问题。

最佳答案

copyCreator<nodeType>::push(ptr)应该拥有 ptr 的所有权.但如果 (a) ptr不是 nodeType* 类型(由 dynamic_cast 确定),以及 (b) 没有 nodeType 类型的节点已经访问过了。

换句话说,copyCreator<nodeType>创建并迅速泄漏所有节点的拷贝,直到它遇到类型之一 nodeType .

这正是 copyCreator<programNode> cpy2(&globalScope, a); 中发生的事情, 其中aforallNode* . cpy2期待遇见programNode (它从不这样做),同时,它复制并泄漏所有其他节点。

关于c++ - 为什么这些访问方式会导致内存泄漏呢?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45289794/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com