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

标签 c++ visual-studio-2013

我有一段这样的代码:

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/

相关文章:

c++ - 有选择地将函数定义添加到 python 命名空间

c++ - constexpr 定义声明为 const 的文字类型的静态数据成员

visual-studio-2013 - devenv.com 在 VS 2013 中挂起

git - Visual Studio 2013 和 BitBucket

从命令行启动时,在 for 循环期间不显示 C++ cout 语句

时间:2018-03-08 标签:c++classesswitchcase

c++ - 为什么省略 push_back 会使循环运行得更慢?

visual-studio-2013 - 打开解决方案之前卸载项目

python - 在当前 visual studio 2013 中运行 visual studio 2008

c++ - 从源代码编译与 deb 包编译