我有一个堆栈类,我正在运行测试用例,并且在尝试弹出空堆栈时遇到了问题。涉及的源文件代码:
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块不太可能是问题的原因,但是评论说它可能触发了它 我也无法改变这样一个事实,即堆栈是建立在一个完整后更新的数组
答案 0 :(得分:1)
在构造函数中,为_arr
分配一个新数组。在push()
中,如果要增加容量,可以将元素复制到堆栈上的数组,并在_arr
中保存指向该数组的指针。这是不安全的,因为该数组将在该函数的if
块的末尾超出范围,在_arr
中留下悬空指针。
写入悬空指针或尝试delete[]
它很容易导致内存损坏。