【问题标题】:Errors from valgrind (Treap)来自 valgrind (Treap) 的错误
【发布时间】:2021-10-31 08:20:25
【问题描述】:

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

/////////////////////////////////////// /////////////////////p>

==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

【问题讨论】:

  • valgrind 显示什么错误?你从来没有delete 任何东西,所以你肯定有内存泄漏
  • @AlanBirtles 我更正了代码,添加了删除。更少的错误。但是还是有错误。
  • 你还没有删除vertexsordered
  • @AlanBirtles 我添加了 ~ decTree () { delete [] vertices;删除[]命令;并且一切正常。谢谢!
  • 不要将structclass 互换使用。一旦某物是class,它总是应该被视为(标记)一个类。前段时间我有一个非常奇怪的构建问题,因为在一个地方符号被不一致地声明。

标签: c++ valgrind treap


【解决方案1】:

明确使用运算符newdelete(或new[]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 &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] = &vertexs[vertexCount];
            vertexCount++;
        }
    }
};

https://godbolt.org/z/co4jbcbvW

【讨论】:

    【解决方案2】:

    我加了

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

    一切正常。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-06-22
      • 2012-12-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多