【发布时间】:2012-08-17 17:53:18
【问题描述】:
我正在编写一个程序来实现一个堆栈,它像现实世界的堆栈一样工作,这意味着当堆栈的大小达到阈值时它会倒塌,因此需要创建一个新堆栈来插入该新元素。
以下是我的程序:
#include <iostream>
#include<vector>
#include<stack>
using namespace std;
class stack_of_plates
{
vector<stack<int> > stacks;
unsigned int stack_size;
public:
stack_of_plates(unsigned int size=100)
{
stack_size=size;
}
void push(int data)
{
if(stacks.empty())
{
stack<int> *sptr= new stack<int>; //on debugging Segmentation fault at thisline
stacks.push_back(*sptr);
}
vector<stack<int> >::iterator it=stacks.end();
if(it->size()==stack_size)
{
stack<int> *sptr= new stack<int>; //on debugging Segmentation fault at thisline
stacks.push_back(*sptr);
}
it->push(data);
}
void pop()
{
if(stacks.empty())
{
cout<<"\nEmpty Stack";
return ;
}
vector<stack<int> >::iterator it=stacks.end();
if(it->empty())
{
it--;
}
it->pop();
}
int top()
{
if(stacks.empty())
{
cout<<"\nEmpty Stack";
return 0;
}
vector<stack<int> >::iterator it=stacks.end();
if(it->empty())
{
it--;
}
return it->top();
}
};
int main()
{
stack_of_plates ss;
ss.push(1);
ss.push(2);
cout<<ss.top();
return 0;
}
在编译时不会出现错误或警告。但是程序因异常错误而终止。 在调试它给出的分段错误错误指示分配新堆栈的问题。 请帮助我在分配新堆栈时应该如何更改我的代码。请帮我消除这个错误。
【问题讨论】:
-
究竟什么是“编程错误”?
-
不,那是不是他们所说的“堆栈指针”...
-
这完全是假的:
stack<int> *sptr= new stack<int>; stacks.push_back(*sptr);。它应该是stacks.push_back(stack<int>());,或stacks.emplace_back();,或stacks.resize(stacks.size() + 1); -
我的问题:我知道我在分配新堆栈时犯了错误。这就是为什么我在这里张贴寻求帮助的原因。请帮助我在我评论的行中应该写什么。
-
两点:如果你在堆上分配堆栈然后像你一样推送它们,你将有内存泄漏,因为你将 copy 推送到堆栈上。其次是
generic_container.end()不返回generic_container中的最后一个条目,所以在使用迭代器之前必须使用it--。