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
时,一切都还可以。
这里可能出现什么问题?
答案 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
旧数组 / edit:构造函数也是如此。如果我正确理解了您的代码,并且n
表示数组的大小,那么您永远不能在给定方法中的任何位置触摸n
而不是ptr = new int[n];
。