gpt4 book ai didi

C++ vector push_back

转载 作者:IT老高 更新时间:2023-10-28 22:00:13 30 4
gpt4 key购买 nike

将新对象元素推送到 std::vector 的正确方法是什么?我希望在 vector 中分配数据。这是否会将对象 newradio 复制到 vector 中,然后在 newradio 超出范围(例如,超出堆栈)时摆脱它?

vector<Radio> m_radios;
Radio newradio(radioNum);
m_radios.push_back(newradio);

然后当我释放包含 m_radios 的对象时,这会释放 vector 分配的所有内存吗?

最佳答案

std::vector 管理自己的内存。这意味着,当调用 vector 的析构函数时, vector 持有的内存被释放。 std::vector 也调用对象的析构函数(通过 erasepop_backclear 或 vector 的析构函数)。

当你这样做时:

Radio newradio(radioNum);
m_radios.push_back(newradio);

您将 newradio 的拷贝(使用 Radio 的复制构造函数创建)添加到 vector 中。 newradio 在超出范围时将被销毁,而在从 vector 中移除时拷贝将被销毁(对于任何对象)。

这是很重要的一点:std::vector 只存储对象的 拷贝,这意味着对象必须有一个有意义的复制构造函数(和一个赋值运算符,但是那是另一个问题)。如果你有一个指针 vector ,那么指针本身将被复制,而不是它指向的内容。请注意,对于每个标准容器(如 std::liststd::set),此行为都是相同的。

根据经验,如果您不使用指针,则不必担心自己会释放内存。

在 C++11 中,大多数标准容器(包括 vector)都有一个 emplace_back 方法,该方法在末尾 inplace 构造一个对象的容器。它接受一堆参数并调用与这些参数最匹配的构造函数(如果不存在这样的构造函数,则失败),使用所述构造函数在容器末尾创建对象,而无需任何拷贝。所以,上面的代码可以改写为:

m_radios.emplace_back(radioNum); // construct a Radio in place, 
// passing radioNum as the constructor argument

同样在 C++11 中,容器通常是移动感知的,因此它们不再要求对象是可复制的:如果它们是可移动的,那么容器将移动它的内容根据需要(例如在重新分配期间)。如果要复制 vector ,仍然需要可复制类型。

关于C++ vector push_back,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7382090/

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