我的对象的构造函数:
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
对象被复制到地图结构中并被销毁,导致指针无用,直到下一个结构被随机分配到它指向的地址。想象一下,调试随机变化的值是多么困难......千万不要误会!
答案 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;
}
}