难以在我的C ++堆栈实现中返回junks

时间:2015-04-14 20:42:28

标签: c++ stack valgrind

我用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错误。我该如何解决?

1 个答案:

答案 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永远不会递减,那么该项目仍保留在堆栈中。如果执行过了那么,函数的其余部分就不能抛出,所以我们总是要么完全成功(项目被复制到正确的目的地并从堆栈中删除),否则函数根本没有效果(项目仍然存在)在堆栈上。)