首页 > 解决方案 > 为什么我的析构函数被多次调用?

问题描述

我创建了一个类并创建了这个类的向量。我cerr在析构函数中放了一条消息,看看它什么时候被调用。我认为同一个析构函数被多次调用。这让我很困惑。

#include <iostream>
#include <vector>

using namespace std;

class temp {
private:
    int _size = 1000;
    int _myBall [1000];
    int _id;
public:
    temp(int id) : _id(id) {}
    ~temp() {
        cerr << "destructor called. ID: " << _id << endl;
    }
};

int main() 
{
    vector<temp> myvec;
    int total_count = 5;
    int count = total_count;
    for(int count = 0;count < total_count; count++) {
        cerr << "count: " << count << endl;
        myvec.push_back(temp(count));
    }

    myvec.clear();
    cerr << "Hello World" << endl;
    system("pause");
    return 0;
}

控制台输出:

count: 0
destructor called. ID: 0
count: 1
destructor called. ID: 0
destructor called. ID: 1
count: 2
destructor called. ID: 0
destructor called. ID: 1
destructor called. ID: 2
count: 3
destructor called. ID: 0
destructor called. ID: 1
destructor called. ID: 2
destructor called. ID: 3
count: 4
destructor called. ID: 0
destructor called. ID: 1
destructor called. ID: 2
destructor called. ID: 3
destructor called. ID: 4
destructor called. ID: 0
destructor called. ID: 1
destructor called. ID: 2
destructor called. ID: 3
destructor called. ID: 4

标签: c++memory-managementheap-memory

解决方案


由于每次std::vector调整大小时都会进行复制,因此会调用析构函数。

std::vector构建后重新分配预定数量的内存(足以容纳一些temp实例) - 这就是capacity. 每次push_back调用时,它都会评估它是否仍有足够的内存分配来容纳新实例。一旦它被填满,它实际上会重新分配另一块内存(足以分配更多的temp实例),然后复制(或移动,如果可能的话)所有现有的实例。这些是您看到记录的析构函数调用。

如果您事先知道该向量需要保存多少个实例,则可以reserve达到该数量。


推荐阅读