VC++ 矢量作为默认参数

VC++ vector as default parameter

本文关键字:默认 参数 VC++      更新时间:2023-10-16

我有一个问题,如果以下短代码确实有效:

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 编译的程序运行良好(在 Linux 上),但当应该设置默认参数时,VC++ 编译的程序会因运行时错误而中断。

Foo foo("value"); // breaks
Foo foo("test", std::vector<std::string>({ "value", "value1" })); // runs fine

调用 Foo foo("value")时的错误是:

File: f:ddvctoolscrtcrtw32miscdbgdel.cpp
Line: 52
Expression: _BLOCK_TYPE_IS_VALID(pHead->nBlockUse)

谁能暗示出了什么问题?

VC2013内部错误。它并不完全与新的C++结构保持同步。

问题出现在调试删除代码中,特别是检查双重删除和删除非堆分配对象的代码。由于相关对象是std::vectorstd::string,因此大致有四种选择:

  1. std::string实现中的错误
  2. std::vector实现中的错误
  3. dbgdel 中的错误.cpp在调试模式下检查delete
  4. 的代码
  5. 默认参数代码中的编译器错误

考虑到这两个测试用例,前三个不太可能。

编辑2:从副本:"initializer_list行为有问题。在其析构函数中,它调用整个范围的向量删除(delete[]),然后再次删除数组中的第一个条目)。 initializer_list是实现的一部分,所以这确实是VS2013中的内部错误。