使用以下代码查看崩溃。我知道initialize_lists在VS中声名狼借,但我认为其中大部分都是用2013 sp3修复的。相同的代码在g ++(6.1)中工作正常。我在这里错过了什么吗?这似乎太简单了。
调试器表明xstring模块中的迭代器无效问题。相同的代码可以找到整数,所以我猜它与某种字符串特定的优化有关。
#include <vector>
#include <iostream>
#include <string>
int main(int argc, char** argv)
{
std::vector<std::string> x = {"a","b","c","d"};
for(auto i : x)
std::cout << i << ":";
std::cout << std::endl;
x.insert(x.end(), {"e","f"}); // Crash here
for(auto i : x)
std::cout << i << ":";
std::cout << std::endl;
return 0;
}
答案 0 :(得分:0)
如果您尝试插入x.insert(x.end(), {"e","f", "g"});
等3个元素,您会感到惊讶。没有崩溃,对吧!
这是MSVC 2013中的一个错误,似乎在MSVC 2015中已得到修复。以下是解释问题发生位置的解释。如果您只尝试声明std::string a{ "a", "b" };
,您会看到它编译得很好,但会导致崩溃。如果再添加一个元素,那么它根本就不会编译。因此,插入会发生的是它调用string
构造函数而不是调用vector
构造函数。