为什么我会收到错误 "malloc(): corrupted top size"?

Why do i get the error "malloc(): corrupted top size"?

我正在尝试使用动态数组实现堆栈:

class stackArray{
public:
    stackArray(){mainArr = new int[arrSize];}

    void push(int data){
        if(curr > arrSize){
            int *newArr = new int[arrSize*2];
            for(int i = 0 ; i < arrSize; ++i){
                newArr[i] = mainArr[i];
            }
            arrSize *= 2;
            delete []mainArr;
            mainArr = newArr;
        }
            mainArr[++curr] = data;
    }
    void print(){ // debug
        for(int i = 0; i < arrSize; ++i){
            std::cout << mainArr[i];
        }
        std::cout << std::endl;
    }

private:
    int *mainArr;
    int curr = -1;
    int arrSize = 10;
};

并且出于某种原因,每当 curr > arrSize 为真并分配一个名为 newArr 的新内存时,它会生成 malloc(): corrupted top size。我还是动态内存的新手,我不明白这个错误。谁能解释一下以及如何解决这个问题?

最初数据成员 curr 等于 tp -1.

现在为了简单起见,我们假设数据成员 arrSize 的初始值等于 1。那就是构造函数动态分配了一个只有一个元素的数组。

因此,由于 curr 不大于 arrSize,因此您在函数 push 中设置 mainArr[0]。现在 curr 等于 0

mainArr[++curr] = data;

同样 curr 不大于 arrSize。因此,在下一次 push 调用中,您试图覆盖不属于动态分配数组的内存,您正尝试使用表达式 mainArr[1].

访问内存

您需要正确更新函数中的 if 语句。例如

if( !( curr + 1 < arrSize ) ){

注意函数 print 通常是不正确的,因为您没有初始化新分配的动态数组的所有元素。

void print(){ // debug
    for(int i = 0; i < arrSize; ++i){
        std::cout << mainArr[i];
    }
    std::cout << std::endl;
}