C++ malloc():try块中的内存损坏

C++ malloc():try块中的内存损坏,c++,malloc,memory-corruption,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

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

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;
}
起初我认为这个问题与try块无关,但是如果我注释掉它,错误就会消失,所以它一定是以某种方式触发了它的发生

编辑:为上下文添加了更多代码 try块不太可能是问题的原因,但正如一条评论所说,它可能是触发问题的原因
我也无法改变这样一个事实,即堆栈构建在一个数组上,该数组一旦满了就会更新。如果要增加容量,请在构造函数中为“推送”分配一个新数组,将元素复制到堆栈上的数组,并将指向该数组的指针保存在_arr中。这是不安全的,因为该数组将在该函数的if块末尾超出作用域,在_arr中留下一个悬空指针


写入悬挂的指针或试图删除[]很容易导致内存损坏。

请仔细检查。现在,什么是?让我猜猜,它是一个尺码吗带A的问题不应让回答者猜测你的问题。MCVE概述:与其扔掉与问题无关的部分源代码,不如将它们从逻辑中删除,这样程序仍然是完全可编译的。内存损坏很可能不是由异常引起的,但在异常处理过程中检测到。表示无需额外的头文件/include/etc即可自行编译。显然,在这种情况下,推送功能是不相关的,您可以将其从MCVE中删除。请再次阅读MCVE帮助页面并仔细阅读。@Sean int new_arr[_capacity*2];-这是无效的C++。C++中的数组必须使用常量表达式来声明,而不是运行时值。如果你已经使用了标准的C++,比如STD::向量,而不是那个语法,那么由某个问题给出的答案所指出的错误就不会发生。但这也提出了排除代码的观点,因为你认为它是有效的-此外,int new_arr[_capacity*2];这条代码不是有效的C++,因为它使用VLA。谢谢你的答案。我会尝试在这一个不同的。way@PaulMcKenzie谢谢你,我没听清楚,而且我和你一样惊讶的是,推送的1000件物品工作得很好!永远不要低估未定义行为的能力,以蓝精灵与你的头。
try {
    s.pop();
} catch ( EmptyStackException e ){
    cout << "exception caught \n";
}
*** 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)