Утечки памяти в программе на С ++ - PullRequest
0 голосов
/ 11 апреля 2020

Моя проблема - утечка памяти где-то в коде. Я не могу найти это ... Я использовал valgrid, и он дал информацию, что утечки памяти происходят, когда я использую метод "add_connection". Я думал, что в конце add_connection я должен удалить память для newNode, но затем программа ломается.

Кстати. Я не могу использовать std :: vector и все в таком духе. Код должен быть действительно базовым c. Его требование; /

list_graph.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);
};

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++;
}

1 Ответ

1 голос
/ 11 апреля 2020

Похоже, проблема в следующем коде:

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] уже заполнено, вы растоптываете этот указатель, теряете его навсегда и выделяете утечки.

Исправление: delete сначала:

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 для использования.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...