传递std :: pair作为参数时发生奇怪的内存泄漏

时间:2014-06-03 23:16:43

标签: c++ memory-leaks constructor std-pair

我的对象的构造函数:

Visited(/*...*/, unsigned d) : /*...*/, node(new Node(make_pair(d,this))) {}

Valgrind声称:

==15806== 112 (56 direct, 56 indirect) bytes in 1 blocks are definitely lost in loss record 8 of 14
==15806==    at 0x4C28C90: operator new(unsigned long) (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==15806==    by 0x405160: Visited::Visited(unsigned int, unsigned int, unsigned int, char, unsigned int) (in /home/maxyan/Workspace/Graf/graf)
==15806==    by 0x403C30: Graph::solve(unsigned int, unsigned int, unsigned int, std::vector<int, std::allocator<int> >&) (Graph.cpp:32)
==15806==    by 0x401A64: main (main.cpp:116)

在进行一些拆分之后,比如将node初始化移动到代码部分并将pair构造与节点构造分开,看起来Valgrind在Node构造函数调用时指向了exacly(但是没有&#39;进去吧。

这是Node构造函数:

Node(const pair<unsigned, Visited*>& d) : data(d), marked(false), degree(0), parent(nullptr), children(new Node()), prev(this), next(this) {}

参数正在通过引用传递,因此在传入Visited时不应创建其他对。

此外,它不是错误的,因为它会在代码的其他部分产生奇怪的行为。通过调用此构造函数来修改由不同Visited指针指向的数据。

编辑: 使用unique_ptr删除了问题。最后一段中的奇怪行为并非由内存泄漏引起。我使用this指针允许从Node访问它所属的Visited,但是在插入Visited之前调用std::map构造函数。临时Visited对象被复制到地图结构中并被销毁,导致指针无用,直到下一个结构被随机分配到它指向的地址。想象一下,调试随机变化的值是多么困难......千万不要误会!

1 个答案:

答案 0 :(得分:3)

使用 new 运算符时,您将在堆部分中创建一个对象。因此,您需要删除。因此,您需要一个指针来执行此操作。

我们可以将内存地址存储在原始指针或智能指针中。如果您的Visited类看起来像这样:

class Visited(){
public:
    Visited();
    Visited(/*...*/)
private:
    Node* node;
}

您可以将Node* node切换为std::unique_ptr<Node> node,这样当Visited对象死亡时,您的Node类实例化将自动删除。

另一种方法是继续使用原始指针,但您必须删除节点指针的内容:

Visited::~Visited(){
   if(node != nullptr){
     delete node;
   }
}
相关问题