avatar
新年小玩一下# pets - 心有所宠
s*A
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();
};
avatar
t*g
2
一 小睡一下
二 狗生第一次offleash hiking
三 在走着玩
四 大家来找我
avatar
A*i
3
head没有new,没有null检查
avatar
y*u
4
四条大狗就是拉风
avatar
s*A
5
head是在每次push一个数据进来的时候new的
template void stack::push(T d){
if(ind==MAXSIZE) {std::cout<node *t=new node (head, d);
head=t;
ind++;
}
现在不是在stack为空的情况下出现segmentation fault的
所以主要的bug应该是除了null检查之外的

【在 A*****i 的大作中提到】
: head没有new,没有null检查
avatar
l*8
6
羡慕.
我家雪中offleash hiking的计划又变成下周日了.
太远了, 来回230 Miles, 5+小时的山路.

【在 t*****g 的大作中提到】
: 一 小睡一下
: 二 狗生第一次offleash hiking
: 三 在走着玩
: 四 大家来找我

avatar
l*o
7
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的定义如下:

avatar
Y*a
8

好远

【在 l******8 的大作中提到】
: 羡慕.
: 我家雪中offleash hiking的计划又变成下周日了.
: 太远了, 来回230 Miles, 5+小时的山路.

avatar
s*A
9
难道在刚开始 T d=head->data;的时候
不是已经把值赋给d了吗?
这又不是reference
为什么delete s了,d就不存在了呢?

【在 l*********o 的大作中提到】
: s 都 delete 了。d 也就不存在了。
avatar
b*2
10
我喜欢的四类狗,被你养全了。哈哈哈
avatar
t*t
11
Stack class 里面的*head没有Initialize, 应该是Null
push以后head指向新生成的node
node *s=head;
head=head->next;
delete s;
pop之后s指向原来那个没有Initialized pointer
delete s seg fault不奇怪
avatar
s*A
12
但是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不奇怪

avatar
l*s
13
能把整段程序发上来吗?



【在 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的定义如下:

avatar
t*t
14
这段程序我可以运行没问题
如果再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<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)的时候

avatar
g*d
15
上gdb调试一下就好了嘛
avatar
R*n
16
head=head->next;
程序里面两次push,第二次pop的时候,上面一句已经把head赋值NULL了(程序里开始
没把head赋值NULL,所以严格来说是uninitialized),第三次pop,T d=head->data
就出问题了。
相关阅读
logo
联系我们隐私协议©2024 redian.news
Redian新闻
Redian.news刊载任何文章,不代表同意其说法或描述,仅为提供更多信息,也不构成任何建议。文章信息的合法性及真实性由其作者负责,与Redian.news及其运营公司无关。欢迎投稿,如发现稿件侵权,或作者不愿在本网发表文章,请版权拥有者通知本网处理。