使用向量初始化参数化构造函数的对象数组
Using vectors to initialize object arrays for parameterized constructors
我正在使用Visual Studio 2010,对C++相对较新。我尝试使用的程序在其声明中有一个带有参数化构造函数和析构函数的类。在列表中的某个地方,有一个使用"new"创建的动态对象数组。但是,我遇到了问题,因为无法为参数化构造函数初始化对象数组。
因此,我尝试实现向量:
std::vector
my_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
,你就不会再看到这些问题了,因为它们会迫使你从一开始就正确思考。
- 对象实例化调用构造函数的次数太多
- Arduino C++在构造函数中用参数声明对象数组
- 模板,函数使用错误的构造函数来复制我的对象
- 我使用向量来创建类对象列表.初始化向量时如何使用参数调用构造函数?
- std::vector::p ush_back() 不会在 MSVC 上编译具有已删除移动构造函数的对象
- 通过构造函数创建的所有对象都具有相同的向量
- 是什么让放置新调用对象的构造函数?
- 复制包含C++所有元素的对象!(构造函数和赋值,最佳实践?
- C++ 对象指针数组的复制构造函数
- 在构造函数中输入对象时C++类成员作用域
- C++:将初始化的对象传递给另一个类的构造函数;需要不必要的构造函数吗?
- 这个C++编译器优化(在自身的实例上调用对象自己的构造函数)的名称是什么,它是如何工作的?
- 如何从构造函数副本 T(const T&)调用对象 T?
- 将另一个类的对象传递到当前类C++的构造函数中(不是成员初始化)
- 如何将我编写的对象传递到另一个类的构造函数中?
- 使用向量初始化参数化构造函数的对象数组
- 在C++中将对象从另一个类传递到另一个类的构造函数?
- 在 C++ 中声明 const 对象需要用户定义的默认构造函数.如果我有一个可变成员变量,为什么不呢?
- 构造函数对象赋值是否泄漏内存
- gcc中不可移动构造函数对象的std::函数