我有一段这样的代码:
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 的第一项被双重删除。 流程如下:
- 构造了initializer_list。
- 目标 vector 的大小被保留为 1,并复制第一项(通过复制构造函数)。
- vector 缓慢增长到 initializer_list 大小。
- initializer_list 通过 vector 析构函数(即
delete[]
)销毁。最后一个元素首先被销毁。 - 第一个元素通过标量析构函数再次销毁(即
delete
)。
我在另一篇文章中看到了这一点,并使用调试器验证了该行为。 见 here
对于 VS2013,initializer_list 仅适用于基本类型。
关于c++ - 为什么第一个元素被破坏?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19747981/