gpt4 book ai didi

c++ - 为什么这个对象没有被销毁?

转载 作者:可可西里 更新时间:2023-11-01 18:18:19 26 4
gpt4 key购买 nike

我花了很长时间试图弄清楚为什么会这样。

  struct Element
{
Element(int number) : number_ID(number)
{ std::cout << "Element number " << number_ID << " is being constructed\n"; }
~Element()
{ std::cout << "Element number " << number_ID << " is being destroyed\n"; }
int number_ID;
};

void createVector()
{
std::vector<Element> objArr;
objArr.reserve(10); // So it doesn't have to reallocate

objArr.emplace_back(1);
objArr.emplace_back(2);
objArr.emplace_back(3);
objArr.emplace_back(4);

objArr.erase(objArr.begin()); // When I erase the first element only element 4 has destructor called
}

int main()
{
createVector();


system("pause");
}

我得到:

Element number 1 is being constructed
Element number 2 is being constructed
Element number 3 is being constructed
Element number 4 is being constructed
//The following called when doing objArr.erase(objArr.begin());
Element number 4 is being destroyed
//The following called after createVector() function exits
Element number 2 is being destroyed
Element number 3 is being destroyed
Element number 4 is being destroyed

永远不会调用元素 1 的析构函数?起初我不知道为什么在删除第一个元素时会调用元素编号 4 的析构函数,然后我想当它移动其成员时可能必须调用析构函数。但是文档说删除后的所有成员都被转移了,并且 2 和 3 的析构函数没有被调用。我真的很困惑。

编辑:好吧,如果这是一个优化步骤,那么文档是错误的,因为:

Removes from the vector either a single element (position) or a range of elements ([first,last)).

This effectively reduces the container size by the number of elements removed, which are destroyed.

那还不算破坏。

最佳答案

vector 试图节省性能。

erase 所做的是将元素 2、3 和 4 向下复制一个元素,覆盖包含 1 的元素。因此第一个元素现在包含 2,等等。然后它销毁最后一个元素,这是 4 的拷贝。

这具有删除第一个元素的效果,但与您想象的方式不同。它删除第一个元素的内容,但不删除对象本身。

根据您在 vector 中存储的类型,这比销毁第一个元素的成本更低,只需在第一个元素的存储中重建第二个元素的拷贝。

Well if this is an optimisation step, then the documentation is wrong, because:

...

That's not destroying then.

文档是正确的,它正在销毁它们。

您的对象是它们包含的值。您声明您的类是可复制的,因此 vector 可以自由复制它们。这意味着两个实例具有相同的值是完全合法的。 vector 利用了它。

如果您使您的类不可复制但不可移动,那么它将正常工作。但是您的移动构造函数还需要将移出的对象置空,以便没有两个实例具有相同的值。

关于c++ - 为什么这个对象没有被销毁?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41865439/

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