C++ 初始化器列表内存故障

C++ 初始化器列表内存故障,c++,c++11,initializer-list,qnx,C++,C++11,Initializer List,Qnx,我正在尝试使用带有初始值设定项\u list的构造函数初始化类的对象 代码如下: QueryBuilder::QueryBuilder(std::initializer_list<std::string> list) { std::cout << "QueryBuilder constructor begin" << std::endl; std::cout << "List size: " << list.size() &

我正在尝试使用带有初始值设定项\u list的构造函数初始化类的对象

代码如下:

QueryBuilder::QueryBuilder(std::initializer_list<std::string> list)
{
   std::cout << "QueryBuilder constructor begin" << std::endl;
   std::cout << "List size: " << list.size() << std::endl;
   for(const auto& element : list)
   {
      std::cout << "List element: " << element << std::endl;
      query_.tokens_.emplace_back(new NameEqualToken(element));
   }
   std::cout << "QueryBuilder constructor end" << std::endl;
}
不幸的是,在执行这部分的过程中,我总是遇到内存故障

Console output:
QueryBuilder constructor begin 
List size: 2857706971 
List element: Path
然后一些随机字符(程序正在尝试读取第二个元素,它不存在)由内存故障最终确定

传递给构造函数的初始值设定项列表的大小似乎无效

PS我也尝试使用const char*作为初始值设定项列表模板参数类型

谁能告诉我我做错了什么


我使用的是GCC4.7.3(交叉编译器armv7)。

您写道“程序正在尝试读取第二个不存在的元素”。如果基于范围的for继续,则第二个元素应该存在。在
emplace\u back
中使用
new
也没有意义,除非
tokens\u
是指针的容器。@bluefog他使用的
QueryBuilder{“Path”}
只有一个元素。这意味着随机字符与循环的第二次迭代无关。这真的应该转换成MCVE。你读过列表大小为285706971的事实吗?我们不需要查看NameEqualToken是什么。@user1770426它不会在成功的代码路径上泄漏,但是如果向量需要重新分配并且重新分配抛出,它将泄漏。您写道“程序正在尝试读取第二个不存在的元素”。如果基于范围的for继续,则第二个元素应该存在。在
emplace\u back
中使用
new
也没有意义,除非
tokens\u
是指针的容器。@bluefog他使用的
QueryBuilder{“Path”}
只有一个元素。这意味着随机字符与循环的第二次迭代无关。这真的应该转换成MCVE。你读过列表大小为285706971的事实吗?我们不需要查看namequaltoken是什么。@user1770426它不会在成功的代码路径上泄漏,但是如果向量需要重新分配并且重新分配抛出,它将泄漏。
Console output:
QueryBuilder constructor begin 
List size: 2857706971 
List element: Path