我的任务是实现一个具有给定容量的堆栈(基于数组),当在堆栈已满后尝试添加另一个元素时,它将增长一个常量值(我使用100)。
我认为这里的问题在于我的push()函数,它为堆栈添加了100个元素......可能是语法,但我不确定为什么我的程序不会执行。
template<class Type>
class ArrayStack{
enum {default_cap=100};
private:
Type* S; //array storing elements
int CAP; //capacity of stack
int TOP; //top element of stack
public:
ArrayStack(int defc = default_cap); //constructor with default parameter
~ArrayStack(){} //is "delete [] S;" supposed to go in here? not sure
bool isEmpty() const { return (TOP<0); }//is the stack empty?
int size() const { return (TOP+1); }
const Type& top(){ return S[TOP];} //has exception handling, not displayed
Type pop() {--TOP;} //removes top element
//here's the function that concerns me:
//--------------------------------------------
void push (const Type& e){
if(size() == CAP) {
Type* Snew = new Type[CAP+100];
for(int i = 0; i < CAP; i++){
Snew[i] = S[i];
}
delete [] S;
++CAP;
S = Snew;
}
S[++TOP] = e;
}
//--------------------------------------------
//other functions...
};
//constructor:
template<typename T> ArrayStack<T>::ArrayStack(int d)
: S(new T[d]), CAP(d), TOP(-1){}
答案 0 :(得分:0)
由于您只提供了部分代码,并且未展示用法(例如使用main()函数),因此有点难以评论。
然而,一个明显的问题[我注意到Roger Rowland在他的评论中也发现了]与push()函数的关系是它将分配的大小增加了100,但只增加了CAP。因此它会向数组添加100个元素,但只报告使用添加的第一个元素。
pop()函数也会丢弃顶部元素,但不会返回它。如果调用者试图使用pop()的返回值 - 并且堆栈类型的用户通常希望能够使用它们弹出的值 - 结果将是未定义的行为。
你的析构函数肯定需要使用operator delete,除非你以其他方式清理动态分配的内存(并且你没有显示出类似内容)。操作符new的重点是在相应的操作符删除之前不释放内存。如果你忘了这样做,它就不会神奇地清理掉,并且只要你的程序运行就会出现内存泄漏(至少)。
如果你想更安全地做事,可以使用std :: vector而不是指针(并避免直接使用operator new)。