Valgrind报告内存泄漏,但我不明白它发生在哪里

时间:2013-12-06 22:21:20

标签: c++ pointers memory-leaks delete-operator

我已经编写了一个前向链表,但是当我通过valgrind运行它时,它在我的remove(const int函数)中报告了内存泄漏,我无法弄清楚原因。

这是valgrind抱怨的删除功能。 该函数位于文件“list.cc”中。

void Plist::remove(const int pos)
{
  current_index = root;
  if( pos == 0 )
  {
    delete root;
    root = current_index -> pointer;
  }
  else
  {
    for(int n = 0; n<pos-1; ++n)
    {
      current_index = current_index -> pointer;
    } 
    index * new_link = current_index -> pointer -> pointer;
    delete current_index -> pointer;
    current_index -> pointer = new_link;
  }
}

这是属于“list.cc”的头文件“list.h”。

class Plist
{
private:

  class index
  {
  public:
    index(int value, index * ptr);
    index(int value);
    int val{0};
    index * pointer{nullptr};
  };


  index * root = nullptr;
  index * current_index = nullptr;
public:
  Plist(){}
  ~Plist();
  Plist (Plist& lst);
  Plist& operator=(Plist& lst);
  void insert(const int val);
  void remove(const int pos);
  void print();
};

任何帮助表示赞赏!

2 个答案:

答案 0 :(得分:2)

这不是您的错误,但此代码不能正确:

current_index = root;
if( pos == 0 )
{
  delete root;
  root = current_index -> pointer;
}

current_index = root起,delete root表示current_index现在指向已销毁的对象,您将在下一行中取消引用该对象。糟糕。

答案 1 :(得分:1)

不是您询问的问题,但此代码不起作用:

current_index = root;
if( pos == 0 )
{
    delete root;
    root = current_index -> pointer;
}

delete rootroot指向的对象或root的副本(例如current_index)已经死亡。你需要这样的东西:

current_index = root;
if (pos == 0) {
    current_index = current_index->pointer;
    delete root;
    root = current_index;
}