Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/139.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;堆损坏_C++ - Fatal编程技术网

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];因为它不是一个构造函数而编写的?所有这些都很好,但看起来他甚至没有在构造函数中分配数组,而是在类中尝试分配数组…