Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/162.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ c+中的内存泄漏+;程序_C++_Pointers_Memory - Fatal编程技术网

C++ c+中的内存泄漏+;程序

C++ 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

我的问题是代码中的某个地方出现内存泄漏。我找不到它。。。我使用了valgrid,它提供了当我使用方法“add_connection”时出现内存泄漏的信息。我认为在add_连接结束时,我应该删除newNode的内存,但是程序崩溃了

顺便说一句,我不能用std::vector之类的东西。代码必须非常基本。其要求/

列表_图.h

#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无论如何,谢谢:)