Ошибки от valgrind (Treap)

#c #valgrind #treap

Вопрос:

Valgrind выдает ошибки в этой программе при реализации структуры данных Treap. Не могу понять, как это исправить. Пытался написать деструктор, ничего не изменилось. Остальная часть кода не включена для простоты. Ошибка находится в этой части кода.

 #include <iostream>
#include <fstream>

using namespace std;
ifstream in("input.txt");
ofstream out("output.txt");

class vertex{
    public:
    int x, y, label;
    struct vertex *parent, *left, *right;
    vertex() {}
};

typedef vertex *pvertex;

class decTree{
    private:
    int treeSize;
    vertex *vertexs;
    pvertex *ordered;
    pvertex root;
    int vertexCount;

    public:
    decTree(){
        int a , b;
        vertexCount = 0;
        in >> treeSize;
        vertexs = new vertex[treeSize];
        ordered = new pvertex[treeSize];
        for (int i = 0; i < treeSize; i   ){
            in >> a >> b;
            ordered[vertexCount] = vertexs   vertexCount;
            vertexCount  ;
        }
    }
};

int main(){
    decTree *mytree = new decTree;
    delete mytree;
}
 

///////////////////////////////////////////////////////////////////

 ==20464== HEAP SUMMARY:
==20464==     in use at exit: 336 bytes in 2 blocks
==20464==   total heap usage: 8 allocs, 6 frees, 90,408 bytes allocated
==20464== 
==20464== 336 (56 direct, 280 indirect) bytes in 1 blocks are definitely lost in loss record 2 of 2
==20464==    at 0x483E217: operator new[](unsigned long) (vg_replace_malloc.c:579)
==20464==    by 0x1094A3: decTree::decTree() (in a.out)
==20464==    by 0x1092AC: main (in a.out)
==20464== 
==20464== LEAK SUMMARY:
==20464==    definitely lost: 56 bytes in 1 blocks
==20464==    indirectly lost: 280 bytes in 1 blocks
==20464==      possibly lost: 0 bytes in 0 blocks
==20464==    still reachable: 0 bytes in 0 blocks
==20464==         suppressed: 0 bytes in 0 blocks
==20464== 
==20464== For lists of detected and suppressed errors, rerun with: -s
==20464== ERROR SUMMARY: 1 errors from 1 contexts (suppressed: 0 from
 

Комментарии:

1. Какие ошибки показывает valgrind? Вы никогда delete ничего не делаете, поэтому у вас наверняка есть утечки памяти

2. @AlanBirtles Я исправил код, добавил удаление. Меньше ошибок. Но все еще есть ошибки.

3. Вы не удалили vertexs или ordered

4. @AlanBirtles Я добавил ~ decTree () { удалить [] вершины; удалить [] упорядоченные; } и все работает. Спасибо!

5. Не обрабатывайте и не заменяйте. struct class Как только что-то является a class , оно всегда должно обрабатываться (помечаться) классом. Некоторое время назад у меня была очень странная проблема с сборкой, поскольку в одном месте символ был объявлен непоследовательно.

Ответ №1:

Явное использование оператора new and delete (или new[] and delete[] ) считается плохой практикой (поскольку используется C 11). Рекомендуется использовать шаблон RAII.

В вашем случае все можно обработать с помощью std;:vector .

 class decTree {
   private:
    int treeSize;
    std::vector<vertex> vertexs;
    std::vector<pvertex> ordered;
    pvertex root;
    int vertexCount;

   public:
    decTree(std::istream amp;in) {
        int a, b;
        vertexCount = 0;
        in >> treeSize;
        vertexs.resize(treeSize);
        ordered.resize(treeSize);
        for (int i = 0; i < treeSize; i  ) {
            in >> a >> b;
            ordered[vertexCount] = amp;vertexs[vertexCount];
            vertexCount  ;
        }
    }
};
 

https://godbolt.org/z/co4jbcbvW

Ответ №2:

Я добавил

 ~ decTree () { 
   delete [] vertices; 
   delete [] ordered; 
} 
 

и все работает.