C++ 使用valgrind仍可访问的分配内存

C++ 使用valgrind仍可访问的分配内存,c++,memory-leaks,valgrind,memcheck,C++,Memory Leaks,Valgrind,Memcheck,我准备在几周后开始一个面向对象的类,但是我在释放内存的概念上遇到了问题。现在我只是将内存分配给堆栈的第一个节点,然后尝试取消分配它。如果有人能帮我找到我的析构函数到底做错了什么,我将不胜感激。提前谢谢 我从valgrind memcheck获得的输出是: ==13653== 8 bytes in 1 blocks are still reachable in loss record 1 of 1 ==13653== at 0x4847DA4: operator new(unsigned i

我准备在几周后开始一个面向对象的类,但是我在释放内存的概念上遇到了问题。现在我只是将内存分配给堆栈的第一个节点,然后尝试取消分配它。如果有人能帮我找到我的析构函数到底做错了什么,我将不胜感激。提前谢谢

我从valgrind memcheck获得的输出是:

==13653== 8 bytes in 1 blocks are still reachable in loss record 1 of 1
==13653==    at 0x4847DA4: operator new(unsigned int) (vg_replace_malloc.c:328)
==13653==    by 0x10A2B: Stack::AddNode(int) (Stack.C:25)
==13653==    by 0x10923: main (Main.C:5)
==13653==
==13653== LEAK SUMMARY:
==13653==    definitely lost: 0 bytes in 0 blocks
==13653==    indirectly lost: 0 bytes in 0 blocks
==13653==      possibly lost: 0 bytes in 0 blocks
==13653==    still reachable: 8 bytes in 1 blocks
==13653==         suppressed: 0 bytes in 0 blocks
代码:

#包括
使用名称空间std;
类堆栈{
私人:
结构节点{
int数据;
节点*prev;
};
节点*stackptr;
公众:
堆栈(){
stackptr=nullptr;
}
~Stack(){
cout-prev=nullptr;
cout-prev=堆叠器;
stackptr=n;
}
}
};
int main(){
堆栈s;
s、 AddNode(1);
s、 AddNode(2);
返回0;
}
编辑:我已经完成了AddNode类。我仍然有一个类似的问题,但是现在有两个内存泄漏(在main中对AddNode的两个调用)


<>编辑:使用C++版本的3.3.0和ValgReD版本3.130/P>(一般)在现代C++中不做手动内存管理。现在已经不是90年代了,我们有更好的方法。研究容器和智能指针(确保你使用的是最新版本的C++,如C++ 17(或者至少C++ 14)。Ohh和
使用名称空间标准最终会咬到你-现在就改掉这个坏习惯吧。在
Stack::AddNode(int data)
中,如果
stackptr
不是null,那么
Stack::Stack(){stackptr=nullptr;}
至少使用构造函数初始化列表(或类内初始化)-构造函数主体是性能影响的最后手段(对象首先默认构造,然后分配给,而不是只初始化一次)。对于一个简单的指针来说没什么大不了的,但是对于复杂的对象来说,它可能是一个杀手,甚至可能不可能(而且这只是一个坏习惯,一般来说,没有正面)。@Jesper Juhl我将无法在我的类中使用智能指针,所以我想最好以我现在的方式来练习使用它们。不过,我同意智能指针的使用要好得多。谢谢你的信息!我将不得不更多地查看构造函数初始化列表。我问的原因是这是内存泄漏<代码>n
不会添加到堆栈中,如果
stackptr!=空PTR
#include <iostream>

using namespace std;

class Stack {
  private:

    struct node{
      int data;
      node * prev;
    };

    node * stackptr;

  public:

   Stack() {
     stackptr = nullptr;
   }

   ~Stack() {
      cout << "Calling destructor" << endl;
      node * p1 = stackptr;
      node * delptr = nullptr;

      while(p1 != nullptr) {
        delptr = p1;
        p1 = p1->prev;
        delptr->prev = nullptr;
        cout << "Deleteing " << delptr->data << " from the stack" << endl;
        delete delptr;
      }
   }

   void AddNode(int data) {
      node * n = new node;
      n->data = data;

      if(stackptr == nullptr) {
        stackptr = n;
        stackptr->prev = nullptr;
      }
      else {
         n->prev = stackptr;
         stackptr = n;
      }
   }
};

int main() {
  Stack s;
  s.AddNode(1);
  s.AddNode(2);
  return 0;
}