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

Qwr*_*wrk 19 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;
}
Run Code Online (Sandbox Code Playgroud)

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

egu*_*gur 5

会发生什么是VS2013中的错误导致initializer_list的第一项上的双重删除.这是流程:

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

我在另一篇文章中看到了这一点并使用调试器验证了行为.看到这里

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