s****A 发帖数: 80 | 1 用linked list实现stack, 这个pop函数 segmentation fault了
template T stack::pop(){
T d=head->data;
node *s=head;
head=head->next;
delete s;
ind--;
return d;
}
node和stack class的定义如下:
template struct node{
node *next;
T data;
node(node* n, T d):next(n),data(d){};
};
template class stack{
public: node *head;
int ind;
stack();
~stack();
void push(T d);
T pop();
bool isEmpty();
}; |
A*****i 发帖数: 3587 | |
s****A 发帖数: 80 | 3 head是在每次push一个数据进来的时候new的
template void stack::push(T d){
if(ind==MAXSIZE) {std::cout<<"STACK OVERFLOW!!"<
node *t=new node (head, d);
head=t;
ind++;
}
现在不是在stack为空的情况下出现segmentation fault的
所以主要的bug应该是除了null检查之外的
【在 A*****i 的大作中提到】 : head没有new,没有null检查
|
l*********o 发帖数: 3091 | 4 s 都 delete 了。d 也就不存在了。
【在 s****A 的大作中提到】 : 用linked list实现stack, 这个pop函数 segmentation fault了 : template T stack::pop(){ : T d=head->data; : node *s=head; : head=head->next; : delete s; : ind--; : return d; : } : node和stack class的定义如下:
|
s****A 发帖数: 80 | 5 难道在刚开始 T d=head->data;的时候
不是已经把值赋给d了吗?
这又不是reference
为什么delete s了,d就不存在了呢?
【在 l*********o 的大作中提到】 : s 都 delete 了。d 也就不存在了。
|
t****t 发帖数: 387 | 6 Stack class 里面的*head没有Initialize, 应该是Null
push以后head指向新生成的node
node *s=head;
head=head->next;
delete s;
pop之后s指向原来那个没有Initialized pointer
delete s seg fault不奇怪 |
s****A 发帖数: 80 | 7 但是segmentation fault不是发生在pop stack最后一个数据(bottom)的时候
而是发生在stack里面有不少数据,pop第一个数据(top)的时候
【在 t****t 的大作中提到】 : Stack class 里面的*head没有Initialize, 应该是Null : push以后head指向新生成的node : node *s=head; : head=head->next; : delete s; : pop之后s指向原来那个没有Initialized pointer : delete s seg fault不奇怪
|
l*****s 发帖数: 774 | 8 能把整段程序发上来吗?
【在 s****A 的大作中提到】 : 用linked list实现stack, 这个pop函数 segmentation fault了 : template T stack::pop(){ : T d=head->data; : node *s=head; : head=head->next; : delete s; : ind--; : return d; : } : node和stack class的定义如下:
|
t****t 发帖数: 387 | 9 这段程序我可以运行没问题
如果再pop一次就crash
template struct node{
node *next;
T data;
node(node* n, T d):next(n),data(d){};
};
template class stack{
public:
node *head;
int ind;
stack(){}
~stack(){}
void push(T d);
T pop();
bool isEmpty();
};
template T stack::pop(){
T d=head->data;
node *s=head;
head=head->next;
delete s;
ind--;
return d;
}
template void stack::push(T d){
if(ind==10) {std::cout<<"STACK OVERFLOW!!"<
node *t=new node (head, d);
head=t;
ind++;
}
int main()
{
stack a;
a.push("abc");
a.push("edf");
std::cout<
std::cout<
return 0;
}
【在 s****A 的大作中提到】 : 但是segmentation fault不是发生在pop stack最后一个数据(bottom)的时候 : 而是发生在stack里面有不少数据,pop第一个数据(top)的时候
|
g*******d 发帖数: 495 | |
R********n 发帖数: 19 | 11 head=head->next;
程序里面两次push,第二次pop的时候,上面一句已经把head赋值NULL了(程序里开始
没把head赋值NULL,所以严格来说是uninitialized),第三次pop,T d=head->data
就出问题了。 |