将 initializer_list 插入向量 <string> 时 VS2013 SP5 崩溃
Crash in VS2013 SP5 when inserting initializer_list into vector<string>
使用以下代码发现崩溃。我知道 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;
}
如果您尝试插入 3 个元素,例如 x.insert(x.end(), {"e","f", "g"});
,您会感到惊讶。没有崩溃,对吧!
这是 MSVC 2013 中的一个错误,似乎已在 MSVC 2015 中修复。这里有一个解释,以阐明问题发生的位置。如果您只尝试声明 std::string a{ "a", "b" };
,您会发现它可以正常编译,但会导致崩溃。如果你再添加一个元素,那么它根本不会编译。因此,插入发生的事情是它调用 string
构造函数而不是调用 vector
构造函数。
使用以下代码发现崩溃。我知道 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;
}
如果您尝试插入 3 个元素,例如 x.insert(x.end(), {"e","f", "g"});
,您会感到惊讶。没有崩溃,对吧!
这是 MSVC 2013 中的一个错误,似乎已在 MSVC 2015 中修复。这里有一个解释,以阐明问题发生的位置。如果您只尝试声明 std::string a{ "a", "b" };
,您会发现它可以正常编译,但会导致崩溃。如果你再添加一个元素,那么它根本不会编译。因此,插入发生的事情是它调用 string
构造函数而不是调用 vector
构造函数。