对象实例化调用构造函数的次数太多

Object Instantiation Calling Constructor Too Many Times

本文关键字:太多 构造函数 实例化 调用 对象      更新时间:2023-10-16

我有一个模板化类,我正试图将其声明为二维模板化对象。当我声明我的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上的构造函数。