C++ 使用valgrind仍可访问的分配内存
我准备在几周后开始一个面向对象的类,但是我在释放内存的概念上遇到了问题。现在我只是将内存分配给堆栈的第一个节点,然后尝试取消分配它。如果有人能帮我找到我的析构函数到底做错了什么,我将不胜感激。提前谢谢 我从valgrind memcheck获得的输出是: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
==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;
}