使用向量初始化参数化构造函数的对象数组

时间:2018-10-08 08:00:48

标签: c++ vector

我正在使用Visual Studio 2010,并且对C ++还是比较陌生。我尝试使用的程序在其声明中有一个带有参数化构造函数和析构函数的类。在清单的某处,使用“ new”创建了动态对象数组。但是,我遇到了问题,因为无法对参数化构造函数进行对象数组初始化。

因此,我尝试实现矢量:

  

std :: vector my_object_array(length,arg); //当前尝试

     

my_object_array =新的class_type [length](arg); //以前的代码

但是,一旦创建了该对象数组,就会调用〜vector析构函数,并且我收到运行时错误“调试声明失败... _BLOCK_TYPE_IS_VALID(pHead-> nBlockUse)”

基于之前关于SO的此类问题,我认为这是由于双重删除,但在调试步骤中我没有明确调用析构函数,并且仍然收到此错误。

感谢您的帮助!谢谢!

编辑:添加了一些代码段,其名称已更改。

class class_type {
  public:
    class_type(int var1);
    ~Class_type();
    /*

     Member functions

    */
  private:
    int var1;                        
    double var2;                   
    double length;                 
    double width;
    double* arr1;                  
};

构造函数定义:

Class_type::Class_type(int il){
  length    = 0;
  width     = 0;
  var1    = il;
  var2   = 5;
  arr1 = new double[5];
}

析构函数定义

  Class_type::~Class_type(){

  delete [] arr1;}

发生错误的代码:

int class_type_2::create_my_objects(int num_elem){
   input_value = 10;
   if ( num_elem == 0 ) {
      std::cout<<"Warning!"<<endl;
   } else {
      std::vector<class_type> my_object_array(num_elem, input_value);
      //my_object_array= new class_type[num_elem](input_value);
        } //Debugger doesn't go beyond this step!
   return 0;
}

2 个答案:

答案 0 :(得分:1)

std::vector my_object_array(length, arg); //current attempt

您的向量可能超出了范围,因为您所写的只是一行。因此,不可能准确回答您的情况。我认为您可能会将向量传递给另一个复制构造函数,或者将其移动到构造函数中,从而删除内存并调用析构函数。

就像@Matthieu Brucher所说的那样,如果使用“ new”分配内存,则应该自己管理内存。否则,重复删除是一个常见问题,并且可能会发生其他内存问题。

编辑1: 看到您的代码后我才更新

std::vector<class_type> my_object_array(num_elem, input_value);
} ---> when this scope hits it will release all stacked memory inside it and call their object constructors

使用nullptr初始化原始指针。

double* arr1; // you have written
double* arr1 = nullptr;  // recommended

编辑2:

如果分配了malloc()或calloc(),则可以删除内存。否则使用向量。它将管理您的内存而不会泄漏。

答案 1 :(得分:0)

如果将std::unique_ptr用于对象而不是double*,则将看到代码不再编译。这表明您拥有的代码使用默认的复制构造函数,并且指针将被复制到复制的类。

不幸的是,这意味着几个对象将具有相同的指针并尝试释放它,这将失败。如果您遵循良好的c ++惯例并且从不自己致电newdelete,那么您将不再看到这些问题,因为它们会迫使您从一开始就进行正确的思考。