如果以下短代码实际有效,我有一个问题:
class Foo {
public:
Foo(std::string param,
const std::vector<std::string>& vec = std::vector<std::string>({ "value 1", "value 2" }))
{}
};
这可以在没有警告的情况下使用gcc和VC ++ 2013进行编译,但是当gcc编译的程序aslo运行正常(在Linux上)时,VC ++编译的程序会在设置默认参数时因运行时错误而中断。
Foo foo("value"); // breaks
Foo foo("test", std::vector<std::string>({ "value", "value1" })); // runs fine
调用 Foo foo时出错(&#34;值&#34;); 是:
File: f:\dd\vctools\crt\crtw32\misc\dbgdel.cpp
Line: 52
Expression: _BLOCK_TYPE_IS_VALID(pHead->nBlockUse)
任何人都可以暗示出了什么问题吗?
答案 0 :(得分:1)
VC2013内部bug。它与新的C ++结构并不完全一致。
问题出现在调试删除代码中,特别是检查双重删除和删除非堆分配对象的代码。由于相关对象为std::vector
和std::string
,因此大致有四种选择:
std::string
实施中的错误std::vector
实施中的错误delete
的dbgdel.cpp代码中的错误考虑到两个测试用例,前三个不太可能。
Edit2:来自副本:“initializer_list
行为是错误的。在它的析构函数中,它调用整个范围的向量删除(delete[]
),然后再次删除数组中的第一个条目)“。 initializer_list
是实现的一部分,因此这确实是VS2013中的内部错误。