【问题标题】:Why do i get the error "malloc(): corrupted top size"?为什么我会收到错误“malloc():损坏的最大尺寸”?
【发布时间】:2021-06-28 21:06:44
【问题描述】:

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

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 &gt; arrSize 为真并分配一个名为newArr 的新内存时,它就会产生malloc(): corrupted top size。我还是动态内存的新手,我不明白这个错误。任何人都可以解释它以及如何解决这个问题?

【问题讨论】:

  • 提示:使用 std::copy 之类的东西来代替这个。
  • 在调试器中逐步检查以了解更多信息。
  • 你把数组的大小加倍,但不要改变arrsize这迟早会咬人的。
  • 调整大小时是否更新arrSize
  • 是的,错误仍然存​​在。请记住,C++ 中的数组原点为零。在 0 和 arrSize -1 之间有效。

标签: c++ class dynamic-memory-allocation


【解决方案1】:

最初数据成员 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;
}

【讨论】:

  • 我明白了,谢谢你的解释。你能给我解释一下为什么会发生“malloc(): 损坏的最大尺寸”吗?
  • @0_NULL 您正在覆盖导致未定义行为的内存。
  • 很抱歉,但我不明白您所说的“覆盖内存”是什么意思,这是怎么回事?
  • @0_NULL 正如我所写,您正在尝试访问未分配的内存。
猜你喜欢
  • 2023-02-17
  • 2021-12-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-24
  • 2018-05-27
  • 1970-01-01
相关资源
最近更新 更多