所有指针未释放的原因?
The reason why all pointers not-freed?
我正在使用链表实现堆栈数据结构,构建 destroyStack() 函数,一旦我完成使用堆栈 class ,我可以通过该函数释放所有分配的内存,因为我执行了我期望得到的 main调用 destroyStack() 后释放的所有指针。
class Stack{
private:
int size;
typedef struct Node{
stackType data;
struct Node *last;
} Node;
Node *top;
public:
Stack(){
size = 0;
top = NULL;
}
void push(stackType element){
Node *temp = new Node();
if (!temp)
throw invalid_argument("heap overflow");
if (element != '[=10=]'){
temp->data = element;
temp->last = top;
top = temp;
size++;
}
else{
throw invalid_argument("invalid element");
}
}
stackType pop(){
if (empty())
throw invalid_argument("this is an empty stack");
Node *temp = new Node();
stackType element = top->data;
temp = top;
top = top->last;
temp->last = NULL;
delete(temp);
size--;
return element;
}
void destroyStack(){
Node *temp = top;
while (top != NULL){
top = top->last;
delete(temp);
temp = top;
}
}
};
int main(){
Stack stack;
stack.push(100);
stack.push(90);
stack.push(80);
stack.printStack();
for (int i = 0; i < 3; i++)
cout << stack.pop() << endl;
stack.destroyStack();
return 0;
}
当我使用 valgrind 检查是否有任何类型的泄漏时,我发现了这条消息。
==53372== HEAP SUMMARY:
==53372== in use at exit: 48 bytes in 3 blocks
==53372== total heap usage: 8 allocs, 5 frees, 73,824 bytes allocated
==53372==
==53372== Searching for pointers to 3 not-freed blocks
==53372== Checked 116,952 bytes
所以有什么想法吗?我如何编辑我的代码以在使用销毁功能后释放所有块?
正如@AlanBirties 已经在评论中提到的,问题是 Node *temp = new Node();
在你的 pop()
函数中。
- 你必须为每个
new
做一个 delete
,所以你不会删除那个块。
- 但是,您甚至不需要那个新节点...因为该指针的目的是保存最后一个已经存在的顶级节点,而不是新节点。
// Problematic code:
Node *temp = new Node();
temp = top; // previous new node is not freed and never used
// Correct code:
Node *temp = top; // no useless memory allocated
您已经在 destroyStack()
中这样做过 ;)
我正在使用链表实现堆栈数据结构,构建 destroyStack() 函数,一旦我完成使用堆栈 class ,我可以通过该函数释放所有分配的内存,因为我执行了我期望得到的 main调用 destroyStack() 后释放的所有指针。
class Stack{
private:
int size;
typedef struct Node{
stackType data;
struct Node *last;
} Node;
Node *top;
public:
Stack(){
size = 0;
top = NULL;
}
void push(stackType element){
Node *temp = new Node();
if (!temp)
throw invalid_argument("heap overflow");
if (element != '[=10=]'){
temp->data = element;
temp->last = top;
top = temp;
size++;
}
else{
throw invalid_argument("invalid element");
}
}
stackType pop(){
if (empty())
throw invalid_argument("this is an empty stack");
Node *temp = new Node();
stackType element = top->data;
temp = top;
top = top->last;
temp->last = NULL;
delete(temp);
size--;
return element;
}
void destroyStack(){
Node *temp = top;
while (top != NULL){
top = top->last;
delete(temp);
temp = top;
}
}
};
int main(){
Stack stack;
stack.push(100);
stack.push(90);
stack.push(80);
stack.printStack();
for (int i = 0; i < 3; i++)
cout << stack.pop() << endl;
stack.destroyStack();
return 0;
}
当我使用 valgrind 检查是否有任何类型的泄漏时,我发现了这条消息。
==53372== HEAP SUMMARY:
==53372== in use at exit: 48 bytes in 3 blocks
==53372== total heap usage: 8 allocs, 5 frees, 73,824 bytes allocated
==53372==
==53372== Searching for pointers to 3 not-freed blocks
==53372== Checked 116,952 bytes
所以有什么想法吗?我如何编辑我的代码以在使用销毁功能后释放所有块?
正如@AlanBirties 已经在评论中提到的,问题是 Node *temp = new Node();
在你的 pop()
函数中。
- 你必须为每个
new
做一个delete
,所以你不会删除那个块。 - 但是,您甚至不需要那个新节点...因为该指针的目的是保存最后一个已经存在的顶级节点,而不是新节点。
// Problematic code:
Node *temp = new Node();
temp = top; // previous new node is not freed and never used
// Correct code:
Node *temp = top; // no useless memory allocated
您已经在 destroyStack()
中这样做过 ;)