Я готовлюсь к объектно-ориентированному классу, который начнется через несколько недель, но у меня возникли проблемы с концепцией освобождения памяти. Теперь я просто выделяю память первому узлу стека, а затем пытаюсь ее освободить. Если бы кто-нибудь мог помочь мне найти то, что я делаю не так с моим деструктором, это было бы очень признательно. Заранее спасибо!
Вывод, который я получаю от memcheck valgrind:
==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
Код:
#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;
}
РЕДАКТИРОВАТЬ: я закончил мой класс AddNode. У меня все еще есть подобная проблема, но с двумя утечками памяти (два вызова AddNode в main).
РЕДАКТИРОВАТЬ: Использование C ++ версии 6.3.0 и valgrind версии 3.13.0
Задача ещё не решена.
Других решений пока нет …