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

Using vectors to initialize object arrays for parameterized constructors

本文关键字:构造函数 对象 数组 参数 向量 初始化      更新时间:2023-10-16

我正在使用Visual Studio 2010,对C++相对较新。我尝试使用的程序在其声明中有一个带有参数化构造函数和析构函数的类。在列表中的某个地方,有一个使用"new"创建的动态对象数组。但是,我遇到了问题,因为无法为参数化构造函数初始化对象数组。

因此,我尝试实现向量:

std::vectormy_object_array(length, arg(;//current try

my_object_array = new 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;
}
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(( 的内存,则可以删除内存。否则使用矢量。 它将管理您的内存而不会泄漏。

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

不幸的是,这意味着多个对象将具有相同的指针并尝试释放它,这将失败。如果你遵循良好的 c++ 实践,从不打电话给new和自己delete,你就不会再看到这些问题了,因为它们会迫使你从一开始就正确思考。