C++ C++;堆损坏
C++ C++;堆损坏,c++,C++,Vectclass: 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 nInit, int arr[]) { n = nInit; for (int i = 0; i < n; i++) {
Vect
class:
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 nInit, int arr[])
{
n = nInit;
for (int i = 0; i < n; i++)
{
ptr[i] = tab[i];
}
}
建造商:
int n;
int* ptr = new int[n];
我发现错误Program.exe触发了断点。
at
msvcr120d.dll_heap\u alloc\u base(无符号整数大小)第58行
。
我也尝试过使用memcpy
有趣的是,当我只调用add
一两次,或者在arr
数组中只发送一个int
时,一切都正常
这里可能出了什么问题?您需要检查n是否小于分配内存时使用的值
void add(int value)
{
n += 1;
ptr[n-1] = value;
}
void add(int值)
{
//添加逻辑以检查您的n在分配时是否少于使用的n。
//if(n
在您的方法中添加增加n
。但是n
仅仅是过去分配了多少内存的指标(在ctor中)。因此,您现在要做的就是增加指示器,并假设阵列现在更大。但你还没有扩大阵列。因此,您正在数组外部写入新值,因此出现异常
如果要将元素添加到数组中,必须:
- 分配第二个数组,比第一个数组大
- 将fist的内容复制到second(这将保留second的最后一个单元格不变)
- 交换这些数组,现在
ptr
将指向新的数组
删除
旧数组
- 最后将新的int赋值到第二个数组的最后一个单元格中
/编辑:构造函数也是如此。如果我正确理解了您的代码,并且n
指示了数组的大小,则在没有ptr=new int[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;
}
您正在使用新建创建大小为'n'的内存
void add(int value)
{
n += 1;
ptr[n-1] = value; // Danger !!!!
}
但是在函数void add(int-value)中,您试图在分配内存不足的位置存储一个数字(问题)
解决方案1:
int* ptr = new int[n];
如果您已经知道要存储在内存中的最大数量是多少,那么首先使用new分配大量内存,然后在分配的大小内进行任意数量的存储
解决方案2:
如果您希望存储的数字比最初分配的多,请使用以下功能分配新内存。(注意:将旧内容复制到新内存,并在使用后删除旧/新分配的内存,以避免内存泄漏。)
int* ptr = new int[n];
您在哪里初始化ptr?n
是否在该点初始化?此外,即使ptr
已正确初始化,您似乎也无法访问数组;int*ptr=新的int[n];因为它不是一个构造函数而编写的?所有这些都很好,但看起来他甚至没有在构造函数中分配数组,而是在类中尝试分配数组…