#include<iostream>
#include<vector>
class Students
{
int *arr_roll;
public:
Students (size_t a){
arr_roll = new int(a);
}
~Students(){
std::cout<<"Destructor called"<<std::endl;
//delete arr_roll;
}
int & operator [] (size_t t){
return arr_roll[t];
}
};
int main(){
std::vector<Students> School(10,5);
School[0][1] = 2;
std::cout<< "School[0][1]: " << School[0][1]<<std::endl;
return 0;
}
我有一个像上面这样的代码,我正在用 gcc 9.5.0 编译它。 我得到的输出如下
**Destructor called**
School[0][1]: 2
Destructor called
Destructor called
Destructor called
Destructor called
Destructor called
Destructor called
Destructor called
Destructor called
Destructor called
Destructor called
任何人都可以解释一下为什么在创建向量期间调用析构函数(第一个打印**标记)
std::vector<Students> School(10,5);
使用 复制构造函数 Students::Students(const Students&)
创建 10
副本。将使用以下 std::vector 向量:
vector( size_type count, const T& value, const Allocator& alloc = Allocator() );
- 使用具有值 value 的元素的
副本构造容器。count
您可以通过添加复制构造函数来验证这一点,如此演示
中所做的那样您的代码有几个与您所询问的构造函数的附加输出无关的问题。大多数问题已解决,归结为:
#include<iostream>
#include<vector>
struct Students
{
Students (size_t a){
}
~Students(){
std::cout<<"Destructor called"<<std::endl;
}
};
void foo(Students) {}
int main(){
foo(5);
}
输出是:
Destructor called
在您的情况下,调用
std::vector<Students> School(10,5);
构造了一个临时 Student
实例。
代码中的大问题是不遵循三法则。你不应该使用原始的
new
。您的构造函数分配一个整数,然后 School[0][1]
访问内存越界。如果修复构造函数来分配数组,那么析构函数中的 //delete arr_roll;
是错误的。使用 std::vector
或 std::array
为您管理阵列。