C++ heap corrupt

C++ heap corrupt

本文关键字:corrupt heap C++      更新时间:2023-10-16
int main()
{
    int a = 3;
    int arr[] = { 5, 3, 6 };
    Vect v(a, arr);
    v.add(1);
    v.add(2);
    v.add(3);
    v.add(4);
    return 0;
}

Vect class:

int n;
int* ptr = new int[n];
构造函数:

Vect(int nInit, int arr[])
{
    n = nInit;
    for (int i = 0; i < n; i++)
    {
        ptr[i] = tab[i];
    }
}

add method in Vect class:

 void add(int value)
 {
    n += 1;
    ptr[n-1] = value;
 }

我得到错误Program.exe has triggered a breakpoint. atmsvcr120d.dll!_heap_alloc_base(unsigned int size) Line 58。我也试过使用memcpy .

有趣的是,当我只调用add一次或两次,或者在arr数组中只发送一个int时,一切都很好。

这里可能出了什么问题?

问题的主要来源是:

void add(int value)
{
   n += 1;
   ptr[n-1] = value; // Danger !!!!
}
使用new创建大小为'n'的内存
  int* ptr = new int[n];

但是在函数void add(int value)中,您试图将数字存储在超出分配内存的位置(问题)。

方案1:

如果你已经知道你想要在内存中存储的最大数字是多少,那么首先使用new分配那么多的内存,然后在分配的大小内执行任意数量的存储。

解决方案2:

如果你想存储比你最初分配的更多的数据,那么使用下面的函数分配一个新的内存(注意:将旧的内容复制到新的内存中,并在使用后删除旧的/新分配的内存,以避免内存泄漏。)

void  Vect::resize(int newSize ) {   
      int* newArr = new int[newSize];
      memcpy( newArr, ptr, n * sizeof(int) );
      n = newSize;
      delete [] ptr;
      ptr = newArr;
}

您需要检查n是否小于分配内存时使用的值。

void add(int value)
 {
    // add logic to check your n is less than used while allocating.
    //if(n < N) 
    n += 1;
    ptr[n-1] = value;
 }

在方法add中增加n。但是n仅仅是您过去分配了多少内存的指示器(在tor中)。你现在要做的就是增加指示值假装数组变大了。但是你没有扩大数组。所以你是在数组外写入新值,因此出现了异常。

如果你想添加一个元素到你的数组中,你必须:

  • 分配第二个数组,比第一个数组大
  • 将第一个单元格的内容复制到第二个单元格(这将使第二个单元格的最后一个单元格保持不变)
  • 交换这些数组,所以现在ptr将指向新的
  • delete旧数组
  • 最后将新的int赋值到第二个
  • 的最后一个单元格

/edit:构造函数也是如此。如果我正确理解你的代码,并且n指示数组的大小,那么在给定的方法中,如果没有ptr = new int[n];,你永远不能触摸n