gpt4 book ai didi

c++ - 为什么第一个元素被破坏?

转载 作者:IT老高 更新时间:2023-10-28 21:58:32 26 4
gpt4 key购买 nike

我有一段这样的代码:

class Data
{
public:
Data(const std::vector<int> &_data)
{
my_data = _data;
}

private:
std::vector<int> my_data;
};


int main()
{
std::vector<std::shared_ptr<Data>> vec = {
std::shared_ptr<Data>(new Data(std::vector<int>({ 1, 2 ,3 }))),
std::shared_ptr<Data>(new Data(std::vector<int>({ 3, 4 ,5 })))
};

// breakpoint

return 0;
}

当我暂停程序以检查值时(在断点处),第一个 (vec[0]) 元素被破坏,而第二个 (vec[1]) 很好。这里发生了什么?这是编译器中的错误吗?我正在使用新的 Visual Studio 2013。

最佳答案

发生的情况是 VS2013 中的一个错误导致 initializer_list 的第一项被双重删除。流程如下:

  1. 构造了initializer_list。
  2. 目标 vector 的大小被保留为 1,并复制第一项(通过复制构造函数)。
  3. vector 缓慢增长到 initializer_list 大小。
  4. initializer_list 通过 vector 析构函数(即 delete[])销毁。最后一个元素首先被销毁。
  5. 第一个元素通过标量析构函数再次销毁(即delete)。

我在另一篇文章中看到了这一点,并使用调试器验证了该行为。见 here

对于 VS2013,initializer_list 仅适用于基本类型。

关于c++ - 为什么第一个元素被破坏?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19747981/

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