gpt4 book ai didi

c++ - 使用 Vectors 创建对象时如何调用析构函数

转载 作者:太空狗 更新时间:2023-10-29 20:57:30 28 4
gpt4 key购买 nike

对于如何在通过 vector 构造的对象上调用析构函数,我有点困惑,但是当我使用指针创建对象时只有一次。

#include <iostream>
#include <vector>
#include <string>

class Student
{
std::string first;
std::string last;
int age;

public:
Student();
Student(std::string f, std::string l, int a) : first(f), last(l), age(a)
{
};
~Student()
{
cout << "Destructor\n";
}
};

int main()
{
std::vector<Student> Univ;
Univ.push_back(Student("fn1", "ln1", 1));
Univ.push_back(Student("fn2", "ln2", 2));
Univ.push_back(Student("fn3", "ln3", 3));
return 0;
}

当我推回一次时,我收到了两次对析构函数的调用。 2 次后退,我收到 5 次析构函数调用。 3 次推回,我收到 9 次析构函数调用。

通常如果我这样做,

Student * Univ = new Student("fn1", "ln1", 1);
delete Univ;

我只接到一次析构函数调用。

这是为什么?

最佳答案

您正在创建一个临时的 Student,您将其传递给 push_back,后者将其复制到 vector 中。结果是您使用了每个 Student 实例的两个拷贝,并且调用了每个实例的析构函数。此外,当您添加更多 Student 并且 vector 调整大小时,现有内容将被复制到新分配的内存中,从而导致更多的析构函数调用。

如果您有可用的 C++11 功能,您可能需要查看 move semantics .

关于c++ - 使用 Vectors 创建对象时如何调用析构函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30510618/

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