C++ c+中的内存泄漏+;程序
我的问题是代码中的某个地方出现内存泄漏。我找不到它。。。我使用了valgrid,它提供了当我使用方法“add_connection”时出现内存泄漏的信息。我认为在add_连接结束时,我应该删除newNode的内存,但是程序崩溃了 顺便说一句,我不能用std::vector之类的东西。代码必须非常基本。其要求/ 列表_图.hC++ c+中的内存泄漏+;程序,c++,pointers,memory,C++,Pointers,Memory,我的问题是代码中的某个地方出现内存泄漏。我找不到它。。。我使用了valgrid,它提供了当我使用方法“add_connection”时出现内存泄漏的信息。我认为在add_连接结束时,我应该删除newNode的内存,但是程序崩溃了 顺便说一句,我不能用std::vector之类的东西。代码必须非常基本。其要求/ 列表_图.h #include <iostream> struct Node{ int value; int weight; Node* next; }; class L
#include <iostream>
struct Node{
int value;
int weight;
Node* next;
};
class List_graph
{
static const int MAX_SIZE =1000;
Node* get_adj_list_node(int dest,Node * head,int weight);
int Node_number=0;
public:
Node** head;
List_graph();
~List_graph();
void add_connection(int source, int target, int weight);
};
#包括
结构节点{
int值;
整数权重;
节点*下一步;
};
类列表图
{
静态常数int MAX_SIZE=1000;
节点*获取\调整\列表\节点(int dest,节点*head,int weight);
int Node_number=0;
公众:
节点**头;
列表_图();
~List_graph();
void add_连接(int源、int目标、int权重);
};
list_graph.cpp
#include "../inc/list_graph.h"
Node* List_graph::get_adj_list_node(int dest,Node * head,int weight)
{
Node * new_node = new Node;
new_node->value=dest;
new_node->weight=weight;
new_node->next = head;
return new_node;
delete [] new_node;
}
List_graph::List_graph()
{
head = new Node *[MAX_SIZE]();
for(int i =0; i<MAX_SIZE;i++)
{
head[i]=nullptr;
}
}
List_graph::~List_graph()
{
for(int i =0; i<MAX_SIZE;i++)
{
delete [] head[i];
}
delete [] head;
}
void List_graph::add_connection(int source, int target, int weight)
{
Node* newNode = get_adj_list_node(target, head[source],weight);
head[source] = newNode;
Node_number++;
}
#包括“./inc/list_graph.h”
节点*列表\图::获取\调整\列表\节点(int dest,节点*head,int weight)
{
Node*new_Node=新节点;
新建节点->值=dest;
新建_节点->权重=权重;
新建节点->下一步=头部;
返回新的_节点;
删除[]个新节点;
}
列表图::列表图()
{
头=新节点*[MAX_SIZE]();
对于(int i=0;i而言,问题似乎出在以下代码中:
void List_graph::add_connection(int source, int target, int weight)
{
Node* newNode = get_adj_list_node(target, head[source],weight);
head[source] = newNode;
Node_number++;
}
注意如果head[source]
已经被填充,那么您将踩下该指针,永远丢失它,并泄漏分配
修复方法是先删除它:
void List_graph::add_connection(int source, int target, int weight)
{
Node* newNode = get_adj_list_node(target, head[source],weight);
delete head[source];
head[source] = newNode;
Node_number++;
}
现在在其他代码中:
Node* List_graph::get_adj_list_node(int dest,Node * head,int weight)
{
// ...
return new_node;
delete [] new_node;
}
delete
行永远不会运行,这也是一件好事,因为您会破坏刚刚进行的分配,而且它也是错误的delete
类型。注意:您对head
中的每个元素调用delete
,无论它是否为nullptr
。您必须跨过每个nullptr
值。不要删除它们。@tadman删除nullptr
完全可以。我在这段代码中没有看到内存泄漏。这并不意味着你没有内存泄漏,只是你没有发布导致内存泄漏的代码。仅仅因为vagrind说泄漏源于add\u connection并不意味着代码导致了泄漏,just泄漏的内存是在那里分配的。add\u connection
可能会用另一个分配替换head
中的现有条目,这样做会丢失对上一个条目的跟踪,从而导致泄漏。@john Ah!如果表达式的计算结果为空指针值,则不会调用析构函数,也不会调用释放函数。"作为C++ 14。谢谢。我已经习惯了一个更旧的更流行的C++标准。不幸的是,指针是他们的,不能保证这个修复不会在代码中的其他地方造成问题。答案没有错,只是指出了OP,这可能不是他们希望的修复。@ john One绷带一次,我们可能会堵塞。l泄漏。你确定问题出在head[source]=newNode;
上吗?从代码中可以看出head[i]
是一个链表,在head[source]=newNode;
执行时newNode->next
已经指向head[source]的当前值
--所以这不应该是一个漏洞。除非我误读了什么。@G.M.这是一种数组/链表的东西,它的形状非常陌生,所以我在这里尽了最大努力。我不认为我们看到了所有的代码,所以可能会有其他问题。当我在链表中看到head
时,我不希望看到数组@TADMAN,你的解决方案对我来说很有效。非常感谢!我知道链表的实现非常奇怪,但是就像我说的那样……当我问老师为什么我们不能使用STD::向量和其他任何C++的商品时,他说“首先,你必须做自己的std::vector实现来理解其中的内容……我不能同意他的观点,这是最好的主意,因为以后我将不得不撤销我学到的所有内容:D无论如何,谢谢:)