C++ 将数组复制到另一个动态数组时出现问题

C++ 将数组复制到另一个动态数组时出现问题,c++,pointers,copy,dynamic-arrays,C++,Pointers,Copy,Dynamic Arrays,我对这个程序的执行有问题。我不知道为什么它运行得如此突然(“程序停止工作”)。不管发生什么,我都希望结果是这样。我尝试了很多方法来避免它,发现导致错误的是函数void intar::addElement(intqtty,int*vec)因为如果我删除它,程序将完美地完成,没有任何错误。分析功能,对我来说很好,我不知道从我手中滑落了什么。您应该做的是传递一个数组,其中包含我想要的元素数量,然后将它们添加到另一个数组中 PS:原来的程序被文件(class.h,class.cpp,main.cpp)分

我对这个程序的执行有问题。我不知道为什么它运行得如此突然(“程序停止工作”)。不管发生什么,我都希望结果是这样。我尝试了很多方法来避免它,发现导致错误的是函数
void intar::addElement(intqtty,int*vec)因为如果我删除它,程序将完美地完成,没有任何错误。分析功能,对我来说很好,我不知道从我手中滑落了什么。您应该做的是传递一个数组,其中包含我想要的元素数量,然后将它们添加到另一个数组中

PS:原来的程序被文件(class.h,class.cpp,main.cpp)分割得很好,只是为了在这里复制它们,我不得不将所有的东西粘贴在一起

谢谢你的帮助。问候

#include <iostream>
using std::cout;
using std::endl;
#define PRESS_KEY std::cout<<"\nPresione Enter para continuar . . .\n";std::cin.get();

class IntArr{
  private:
    int * p;
    int size;
    int used;
    //Verificador
    void redimensionador(int cant);

  public:
    //Constructores
    IntArr (int sz);
    IntArr (int sz,int qtty,int *vec);
    //Destructor
    ~IntArr();
    //Visualizadores
    void prtArr (void) const;
    void prtArr (int cant);
    //Accesores
    int getSize(){return size;};
    int getUsed(){return used;};
    //Operaciones
    void addElement(int xx);
    void addElement(int qtty,int *vec);
};
//Constructores
IntArr::IntArr(int sz){
  size = sz;
  used = 0;
  p = new int[size];
}
IntArr::IntArr(int sz,int qtty,int* vec){
  if(qtty>sz){
    sz = qtty;
  }
  size = sz;
  used = qtty;
  p = new int[size];
  p = vec;
}

//Destructor
IntArr::~IntArr(){
  delete []p;
}

//Visualizadores
void IntArr::prtArr(void) const{
  if(used == 0){
    cout<<endl<<"El array no tiene elementos."<<endl;
  }
  else{
    cout<<endl<<"Array: ";
    for(int i=0;i<used;i++){
      cout<<p[i]<<", ";
    }
    cout<<endl;
  }
}
void IntArr::prtArr(int cant){
  if(used == 0){
    cout<<endl<<"El array no tiene elementos."<<endl;
  }
  else{
    cout<<endl<<"Array: ";
    for(int i=0;i<cant;i++){
      cout<<p[i]<<", ";
    }
    cout<<endl;
  }
}

//Operaciones
double IntArr::getAvg(){
  double acum = 0;
  for(int i=0;i<used;i++){
    acum += p[i];
  }
  return (acum/used);
}
void IntArr::addElement(int xx){
  redimensionador(1);
  p[used] = xx;
  used++;
}
void IntArr::addElement(int qtty,int *vec){
  int j=0;
  redimensionador(qtty);
  for(int i=used;i<(used+qtty);i++){
    p[i] = vec[j];
    j++;
  }
  used += qtty;
}

//Verificador
void IntArr::redimensionador(int cant){
  if(cant+used>size){
    if(cant > 5){
      size += cant;
    }
    else{
      size += 5 + cant;
    }
  }
}

int main(int argc, char *argv[]){
  int v_aux[]= {0,5,10,15,20,25,30,35,40};
  IntArr A(10,sizeof(v_aux)/sizeof(int),v_aux);
  cout<<" size:"<<A.getSize()<<endl<<" used:"<<A.getUsed()<<endl;
  A.prtArr();
  A.addElement(77);
  cout<<" size:"<<A.getSize()<<endl<<" used:"<<A.getUsed()<<endl;
  A.prtArr();
  A.addElement(11);
  cout<<" size:"<<A.getSize()<<endl<<" used:"<<A.getUsed()<<endl;
  A.prtArr();
  A.addElement(8,v_aux);
  cout<<" size:"<<A.getSize()<<endl<<" used:"<<A.getUsed()<<endl;
  A.prtArr();
  PRESS_KEY;
}
#包括
使用std::cout;
使用std::endl;

#define PRESS_KEY std::cout如果内存不足,不能通过添加整数来表示大小更大。您必须重新分配内存,将旧数组中的值复制到新数组中,然后删除旧数组

你在这里也要小心。原始指针容易出错,我看到这里有一些奇怪的结构。例如,IntArr::IntArr(intsz,intqtty,int*vec)分配一个指针,然后立即覆盖它。这一分配是一个漏洞


确保您正确地更新了大小和使用,这样您就不会忘记实际拥有的内存量。当大小改变时,缓冲区也必须改变,否则就会失去同步

如果内存不足,不能通过添加整数来表示大小更大。您必须重新分配内存,将旧数组中的值复制到新数组中,然后删除旧数组

你在这里也要小心。原始指针容易出错,我看到这里有一些奇怪的结构。例如,IntArr::IntArr(intsz,intqtty,int*vec)分配一个指针,然后立即覆盖它。这一分配是一个漏洞


确保您正确地更新了大小和使用,这样您就不会忘记实际拥有的内存量。当大小改变时,缓冲区也必须改变,否则就会失去同步

我注意到的一个问题是以下几行:

p = new int[size];
p = vec;
当您这样做时:

  • 你有内存泄漏。
    new int[size]
    返回的值将丢失到程序中
  • p
    指向
    main
    中静态定义的数组。当您使用
    delete[]p在析构函数中
  • 我猜您想将值从
    vec
    复制到
    p
    。您必须逐个复制这些值

    手动编码的版本:

    for (int i = 0; i < used; ++i )
    {
       p[i] = vec[i];
    }
    

    我注意到的一个问题如下:

    p = new int[size];
    p = vec;
    
    当您这样做时:

  • 你有内存泄漏。
    new int[size]
    返回的值将丢失到程序中
  • p
    指向
    main
    中静态定义的数组。当您使用
    delete[]p在析构函数中
  • 我猜您想将值从
    vec
    复制到
    p
    。您必须逐个复制这些值

    手动编码的版本:

    for (int i = 0; i < used; ++i )
    {
       p[i] = vec[i];
    }
    

    即使此构造函数也存在内存泄漏,并可能导致未定义的行为(例如,当
    vec
    指向本地数组的第一个元素时,或当参数
    vec
    所指向的数组将被删除时)

    首先分配内存并将其地址分配给
    p
    ,然后重新分配p

      p = new int[size];
      p = vec;
    
    必须将参数
    vec
    指向的数组中的元素复制到数据成员
    p
    指向的分配内存中

    这个成员函数

    void IntArr::redimensionador(int cant){
      if(cant+used>size){
        if(cant > 5){
          size += cant;
        }
        else{
          size += 5 + cant;
        }
      }
    }
    

    没有道理。您必须重新分配数据成员
    p

    指向的原始数组,即使此构造函数存在内存泄漏,也可能导致未定义的行为(例如,当
    vec
    指向本地数组的第一个元素时,或当参数
    vec
    指向的数组将被删除时)

    首先分配内存并将其地址分配给
    p
    ,然后重新分配p

      p = new int[size];
      p = vec;
    
    必须将参数
    vec
    指向的数组中的元素复制到数据成员
    p
    指向的分配内存中

    这个成员函数

    void IntArr::redimensionador(int cant){
      if(cant+used>size){
        if(cant > 5){
          size += cant;
        }
        else{
          size += 5 + cant;
        }
      }
    }
    

    没有道理。您必须重新分配数据成员
    p

    所指向的原始数组,该数据成员说“程序停止工作”的是谁或什么?找一个合适的调试器来运行程序,并找出到底发生了什么。谁或什么说“程序停止工作了”?找一个合适的调试器来运行程序,并查明到底发生了什么。在提供的代码段中没有未定义的行为。@SergeyA我说过“可能会有结果”。例如,参数是指向本地数组第一个元素的指针。是的,问题肯定是第一个代码段。第二个很好。谢谢@VladfromMoscow!在提供的代码段中没有未定义的行为。@SergeyA我说过“可以导致”。例如,参数是指向本地数组第一个元素的指针。是的,问题肯定是第一个代码段。第二个很好。谢谢@VladfromMoscow!好啊但它不应该用于大小?第二个选择我不知道。谢谢@卡尔文,你是说它应该使用
    used
    ?这是有道理的。
    used
    是一个变量,它告诉我将使用的元素数。因为如果我输入大小,它会复制垃圾元素。我说得对吗?好的。但它不应该用于大小?第二个选择我不知道。谢谢@卡尔文,你是说它应该使用
    used
    ?这是有道理的。
    used
    是一个变量,它告诉