【发布时间】:2011-04-12 02:00:08
【问题描述】:
我有以下代码用于在图中创建节点。运行静态检查工具(覆盖率)时出现资源泄漏错误。如果您能指出如何改进代码,我将不胜感激:
class node {
public :
explicit node(std::string& name) : m_name(name) { }
void setlevel(int level)
{ m_level = level; }
private :
...
}
class graph {
public :
void populateGraph()
{
std::string nodeName = getNodeName();
/* I get error saying variable from new not freed or pointed-to in function
nc::node::node(const std::string...) */
node* NodePtr = new node(nodeName);
/* I get error saying variable NodePtr not freed or pointed-to in function
nc::node::setLevel(int) */
NodePtr->setLevel(-1);
if (m_name2NodeMap.find(nodeName) == m_name2NodeMap.end())
m_name2NodeMap[nodeName] = NodePtr;
NodePtr = NULL;
}
....
private :
std::map< std::string, node*> m_name2NodeMap;
}
我以为我需要在populateGraph 中添加delete NodePtr,但随后发布它会调用节点析构函数(~node)并从图中删除节点。所以,我设置了NodePtr=NULL 看看它是否有帮助,但它没有。
【问题讨论】:
-
每个新的都需要删除,而您在任何地方都没有删除。如果编译器为 Node 对象分配了内存,编译器会清理它。但如果你明确使用“new”,则需要使用“delete”进行清理。在我看来,您应该在创建之前检查 nodeName 是否存在于您的地图中。您的图形类应该有一个解构器,它将在 m_name2NodeMap 中的每个元素上调用 delete。
-
@Apprentice 队列:不,每个
new都不需要delete。每个new结果应 存储在资源管理器(智能指针或其他任何东西)中,该管理器将在调用时处理内存。尝试手动操作类似于在火药桶中使用火炬。 -
@Matthieu M.,我认为在这里使用“资源管理器”有点矫枉过正,并且黑箱化了应该释放分配的基本思想。
-
@Apprentice Queue:不是。
unique_ptr、scoped_ptr或auto_ptr绝不是矫枉过正。它们很简单,运行良好,而且与手写代码不同,它们不会搞砸。delete是一种代码气味(或“代码预兆”,一种阻碍厄运的警告)。 RAII 是唯一可靠的解决方案,任何选择不可靠解决方案的人要么是恶意的,要么是无知的。我希望后者能被击退。
标签: c++ pointers graph coverity-prevent