我做了一個使用list-node的堆棧類。 但一個正常工作,另一個總是崩潰。 兩個程序有什麼區別? 我thimk析構函數銷燬兩個程序之間的區別?
#include<iostream>
using namespace std;
class Stack
{
public:
int pop() {
data = next->data;
auto tmp = next;
next = next->next;
delete tmp;
return data;
}
void push(int n) {
Stack* p = new Stack();
p->data = n;
p->next = next;
next = p;
}
virtual ~Stack() {
free();
}
void free() {
while(next) pop();
}
protected:
int data;
Stack* next = nullptr;
};
int main()
{
Stack s;
s.push(1);
s.push(2);
//s.free();
}
上述方案老是死機..
#include<iostream>
using namespace std;
class Stack
{
public:
int pop() {
data = next->data;
auto tmp = next;
next = next->next;
delete tmp;
return data;
}
void push(int n) {
Stack* p = new Stack();
p->data = n;
p->next = next;
next = p;
}
virtual ~Stack() {
// free();
}
void free() {
while(next) pop();
}
protected:
int data;
Stack* next = nullptr;
};
int main()
{
Stack s;
s.push(1);
s.push(2);
s.free();
}
這個程序能正常工作。
兩者有什麼區別?
區別在於一行在上面的代碼中被註釋掉了。上述代碼中的'free()'很可能導致「雙重釋放或損壞」錯誤。解決方法:使用智能指針(--you標記爲C++ 11)。 – davidhigh
在評論之前閱讀代碼.. – Parker