我用C ++实现了一个堆栈,但是我遇到了返回junks的问题。 例如,我有:
...
template<class T>
T stack<T>::pop()
{
/* Verific dacă există elemente pe stivă */
if( isEmpty() )
{
T junk;
fprintf(stderr, "No data.\n");
return junk;
}
...
}
这不是解决问题的正确方法,因为我会遇到valgrind错误。我该如何解决?
答案 0 :(得分:1)
这是一个糟糕的主意,因为(除其他外)如果T
的复制构造函数可以抛出,它可以销毁数据(从堆栈中删除项目,然后复制以返回项目抛出,这会破坏副本)。
解决问题的一种方法是将界面更改为:
void stack<T>::pop(T &ret) {
if (!isempty())
ret = data[top--];
}
或者,提供是否成功的指示:
bool stack<T>::pop(T &ret) {
if (isempty())
return false;
ret = data[top];
--top;
return true;
}
这样,如果复制构造函数抛出,top
永远不会递减,那么该项目仍保留在堆栈中。如果执行过了那么,函数的其余部分就不能抛出,所以我们总是要么完全成功(项目被复制到正确的目的地并从堆栈中删除),否则函数根本没有效果(项目仍然存在)在堆栈上。)