C ++堆损坏了

时间:2014-03-24 12:15:02

标签: c++

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上课:

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];
    }
}

Vect类中添加方法:

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

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

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

这里可能出现什么问题?

3 个答案:

答案 0 :(得分:1)

问题的主要来源是:

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

您正在使用

创建大小&#39; n&#39; 的内存
  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;
}

答案 1 :(得分:0)

您需要检查n是否小于分配内存时使用的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;
 }

答案 2 :(得分:0)

在方法add中,您增加了n。但是n仅仅是过去(在ctor中)分配了多少内存的指标。所以你现在正在做的只是增加指标并假装阵列现在更大。但你还没有放大阵列。所以你正在编写数组的新值OUTSIDE,因此是例外。

如果要将元素添加到数组中,则必须:

  • 分配第二个数组,大于第一个数组
  • 将拳头的内容复制到第二个(这留下第二个未触及的最后一个单元格)
  • 交换这些数组,现在ptr将指向新的数组
  • delete旧数组
  • 最后将新int分配到第二个
  • 的最后一个单元格中

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