malloc():try块

时间:2018-03-06 01:41:38

标签: c++ malloc memory-corruption

我有一个堆栈类,我正在运行测试用例,并且在尝试弹出空堆栈时遇到了问题。涉及的源文件代码:

stack::stack(int)
{
    _tos = -1;
    _capacity = 8;
    _arr = new int[_capacity];
}

void stack::push(const TYPE x)
{
    if(_tos == _capacity - 1)
    {
        int new_arr[_capacity * 2];
        for (int i = 0; i < _capacity; i++)
            new_arr[i] = _arr[i];
        _arr = new_arr
    }
    _arr[++_tos] = x;
}

void stack::pop()
{
    if(stack::empty())
        throw EmptyStackException();
    _tos--;
}

bool stack::empty()
{
    if(_tos == -1)  //_tos == -1 when the stack is empty
        return true;
    else
        return false;
}

我正在使用的测试用例代码(在main()的最后找到):

try {
    s.pop();
} catch ( EmptyStackException e ){
    cout << "exception caught \n";
}

在此之前,我的测试将10000个值推送到堆栈,然后删除所有这些值而没有问题,因此我的pop()通常没有问题。

我的错误(浓缩):

*** Error in `./stackTest2': malloc(): memory corruption: 0x00000000006d2ca0 ***
======= Backtrace: =========
/lib64/libc.so.6(+0x7cbac)[0x7f7b21805bac]
...
======= Memory map: ========
00400000-00402000 r-xp 00000000 08:11 23070058                           
...
Aborted (core dumped)

最初我认为这个问题与try块没有任何关系,但如果我把它注释掉,那么错误就会消失,所以它必须以某种方式触发它。

编辑:为上下文添加了更多代码 try块不太可能是问题的原因,但是评论说它可能触发了它 我也无法改变这样一个事实,即堆栈是建立在一个完整后更新的数组

1 个答案:

答案 0 :(得分:1)

在构造函数中,为_arr分配一个新数组。在push()中,如果要增加容量,可以将元素复制到堆栈上的数组,并在_arr中保存指向该数组的指针。这是不安全的,因为该数组将在该函数的if块的末尾超出范围,在_arr中留下悬空指针。

写入悬空指针或尝试delete[]它很容易导致内存损坏。