gpt4 book ai didi

c++ - 为什么我的析构函数被调用的次数比预期的多?

转载 作者:太空狗 更新时间:2023-10-29 23:46:05 27 4
gpt4 key购买 nike

我写这段代码是为了检查 c++ 中析构函数的行为

#include <vector>
#include <iostream>

using namespace std;


class WrongDestructor
{
private:
int number;
public:
WrongDestructor(int number_) :
number(number_)
{}

~WrongDestructor() {

cout<<"Destructor of " <<number<<endl;

// throw int();
}
};
int main(int argc, char *argv[])
{
std::vector<WrongDestructor> wrongs;

for(int i = 0; i < 10; ++i) {
wrongs.push_back(WrongDestructor(i));
}

return 0;
}

我发现有趣的是我的程序的输出:

Destructor of 0
Destructor of 0
Destructor of 1
Destructor of 0
Destructor of 1
Destructor of 2
Destructor of 3
Destructor of 0
Destructor of 1
Destructor of 2
Destructor of 3
Destructor of 4
Destructor of 5
Destructor of 6
Destructor of 7
Destructor of 0
Destructor of 1
Destructor of 2
Destructor of 3
Destructor of 4
Destructor of 5
Destructor of 6
Destructor of 7
Destructor of 8
Destructor of 9
Destructor of 0
Destructor of 1
Destructor of 2
Destructor of 3
Destructor of 4
Destructor of 5
Destructor of 6
Destructor of 7
Destructor of 8
Destructor of 9

这意味着创建的对象比我想象的要多得多。当我在 for 循环中填充集合时,我预计集合中显然有 10 个,也许接下来的 10 个创建为临时对象。但是它们的数量更多,其中一些甚至比其他的创建得更频繁。

最佳答案

vector 必须分配更大的内存块来保存元素时,新元素将移动构造到新的更大的内存块中。因为您的类型没有定义移动构造函数或复制构造函数,所以您得到的是编译器提供的默认复制构造函数。默认复制构造函数对类中的所有成员进行简单的成员复制。

此外,使用 push_back 插入元素本身需要将其移动或复制到 vector 中。因此,假设您的编译器没有优化它,您也会在那里获得拷贝。 (请注意,您可以使用 emplace_back 避免这些拷贝。)

因此,您会提前将多个实例拷贝插入到容器中,因为例如1 被复制到 vector 内一个更大的内存缓冲区,它在旧的、更小的缓冲区中被销毁。

您可以通过定义复制和/或移动构造函数更清楚地看到此行为:

#include <vector>
#include <iostream>

using namespace std;


class WrongDestructor
{
private:
int number;
public:
WrongDestructor(int number_) :
number(number_)
{}

// Copy constructor
WrongDestructor(WrongDestructor const& copied)
: number(copied.number)
{
cout << "Copied " << this->number << endl;
}

~WrongDestructor() {

cout<<"Destructor of " <<number<<endl;

// throw int();
}
};
int main(int argc, char *argv[])
{
std::vector<WrongDestructor> wrongs;

for(int i = 0; i < 10; ++i) {
wrongs.push_back(WrongDestructor(i));
}

return 0;
}

此程序提供以下输出:http://ideone.com/S5Zf41

关于c++ - 为什么我的析构函数被调用的次数比预期的多?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13785834/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com