对象实例化调用构造函数的次数太多
Object Instantiation Calling Constructor Too Many Times
我有一个模板化类,我正试图将其声明为二维模板化对象。当我声明我的2D对象时,我的构造函数被调用了大约15次,出于我认为相关的原因,我的析构函数试图删除未分配的内存。我怀疑这与我试图将类的另一个实例作为模板参数传递的方式有关。。。
一个可能相关的问题是,当main进行过多的构造函数调用时,我的析构函数被调用,我得到了一个malloc错误。如果没有新的运算符,我似乎找不到分配内存的位置。。。据我所知,my_vector的每个可能实例都应该为数组分配new
内存。
为什么我的构造函数在主函数的第一行被反复调用?
main.cpp
#include <iostream>
#include "My_vector.h"
int main() {
My_vector<My_vector<bool>> board; //this is where I get 15 calls to the constructor
My_vector<bool> row(4, 0);
board.push_back(row);
}
My_vector.h
#include <cstring>
#include <initializer_list>
template <typename Type>
class My_vector {
private:
Type* array;
int vector_capacity;
int vector_size;
public:
//Constructors
My_vector(int n = 0) { //keeps getting called
vector_capacity = n + 10;
array = new Type[vector_capacity];
vector_size = 0;
}
My_vector(int n, Type value) {
initialize(n + 10);
for ( ; n > 0; n--) {
push_back(value);
}
}
My_vector(std::initializer_list<Type> list) {
initialize(list.size() + 10);
memcpy(array, list.begin(), sizeof(Type) * list.size());
}
//Destructor
~My_vector() {delete [] array; array = nullptr;} //get a "pointer being freed was not allocated" error in the same line that creates the excessive constructor calls
//Accessors
int size() const {return vector_size;}
int capacity() {return vector_capacity;}
Type& at(int const) const;
//Mutators
void push_back(Type const& val);
void increase_capacity();
void initialize(int n = 10);
void erase(int);
void resize(int, Type val = Type());
void assign(std::initializer_list<Type> list);
};
template <typename Type>
void My_vector<Type>::push_back(Type const& val) {
if (size() == capacity()) {
increase_capacity();
}
array[vector_size++] = val;
}
template <typename Type>
void My_vector<Type>::increase_capacity() {
Type* temp_array = new Type[1.5 * capacity()];
memcpy(temp_array, array, size() * sizeof(Type));
delete [] array;
array = temp_array;
vector_capacity = 1.5 * capacity();
}
template <typename Type>
Type& My_vector<Type>::at(int const index) const {
return *(array + index);
}
template <typename Type>
void My_vector<Type>::initialize(int n) {
vector_capacity = n;
array = new Type[vector_capacity];
vector_size = 0;
}
您的调用会将您带到第一个构造函数:
My_vector(int n = 0) { //keeps getting called
在这个构造函数中,您可以再创建10个My_vector<bool>
对象:
vector_capacity = n + 10;
array = new Type[vector_capacity];
同样,第一个条目是板对象的My_vector对象的My_vector。
同一构造函数中的其余条目分别用于您在上面的代码中创建的10个新的My_vector的bool对象。
我想你得到的构造函数调用了11次
该行1次:主中的My_vector<My_vector<bool>> board;
该行10次:构造函数中的array = new Type[vector_capacity];
第二行再次调用构造函数10次,因为vector_capacity默认为10
array = new Type[vector_capacity];
为该数组中创建的每个对象调用默认构造函数。由于您有My_vector<My_vector<bool>> board;
,这是意料之中的事,它会调用每个内部My_vector
上的构造函数。
相关文章:
- 对象实例化调用构造函数的次数太多
- C++:使用运算符 = 调用多参数构造函数
- 如何在派生构造函数中多次构造基类
- C++使用函数对象的线程,如何调用多个析构函数而不是构造函数?
- 静态类属性,C++中的多个构造函数
- 如何同时创建一个具有两个或多个构造函数初始化的对象
- 多复制构造函数继承中的惊人行为
- 转换具有多个参数的构造函数
- 如何通过可变参数模板将多个构造函数参数转发到数组初始值设定项列表?
- 自定义异常中的用户定义的空构造函数,具有多个继承和抽象基类
- C++ 显式多参数构造函数歧义
- C++,处理多个构造函数重载和冗余代码
- 如何处理带有指针的类的双(或多个)复制构造函数
- 为什么比“构造函数”调用更多的“解构器”调用
- C 如何仅实现多个继承类的一个构造函数
- 如何在C 中的单个构造函数中调用多个构造函数
- 依赖注入/继承设计模式的构造函数参数太多
- libclang返回了太多关于函数声明的信息
- C++中的构造函数参数太多
- 在最深层的继承类中构造函数参数太多