在c++中调用析构函数创建Vector数组

问题描述 投票:0回答:2
#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

任何人都可以解释一下为什么在创建向量期间调用析构函数(第一个打印**标记)

c++ vector destructor
2个回答
0
投票

std::vector<Students> School(10,5);
使用 复制构造函数
Students::Students(const Students&)
创建
10
副本。将使用以下 std::vector 向量:

vector( size_type count,
                const T& value,
                const Allocator& alloc = Allocator() );
  1. 使用具有值 value 的元素的
    count
    副本构造容器。

您可以通过添加复制构造函数来验证这一点,如此演示

中所做的那样

0
投票

您的代码有几个与您所询问的构造函数的附加输出无关的问题。大多数问题已解决,归结为:

#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
为您管理阵列。

© www.soinside.com 2019 - 2024. All rights reserved.