c++ - 在空 std::vector 上使用 operator[]

标签 c++ visual-studio-2010 vector

不久前有人告诉我,在 C++ 中使用 std::vector 作为异常安全动态数组是很常见的地方,而不是分配原始数组......例如

{
    std::vector<char> scoped_array (size);
    char* pointer = &scoped_array[0];

    //do work

} // exception safe deallocation

我多次使用这个约定没有问题,但是我最近将一些代码移植到 Win32 VisualStudio2010(以前它只在 MacOS/Linux 上)并且我的单元测试失败了(stdlib 抛出断言)当 vector 大小恰好为零时

我知道写入这样的数组会是一个问题,但这个假设打破了这个作为原始指针替代的解决方案。考虑以下 n = 0

的函数
void foo (int n) {
   char* raw_array = new char[n];
   char* pointer = raw_array;
   file.read ( pointer , n );
   for (int i = 0; i < n; ++i) {
      //do something
   }
   delete[] raw_array;
}

虽然可以说是多余的,但上面的代码是完全合法的(我相信),而下面的代码将在 VisualStudio2010 上抛出一个断言

void foo (int n) {
   std::vector<char> scoped_array (n);
   char* pointer = &scoped_array[0];
   file.read ( pointer , n );
   for (int i = 0; i < n; ++i) {
  //do something
   }
}

我一直在使用未定义的行为吗?我的印象是 operator[] 没有进行错误检查,这是对 std::vector<> 的有效使用。有没有其他人遇到过这个问题?

--编辑: 感谢所有有用的回复,回复人们说这是未定义的行为。 有没有办法替换上面的原始数组分配,它将与 n = 0 一起使用?

虽然说检查 n=0 作为异常(exception)情况将解决问题(它会)。有许多不需要特殊情况的模式(例如上面的原始指针示例),所以可能需要使用 std::vector<> 以外的东西?

最佳答案

参见 LWG issue 464 .这是一个已知的问题。 C++0x(由 MSVC 2010 部分实现)通过添加一个 .data() 成员解决了这个问题。

关于c++ - 在空 std::vector 上使用 operator[],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3829788/

相关文章:

c# - 将 MS Access 数据库添加到 Visual Studio 2010 Express 中的项目

r - 在 R 中的数据框列中使用向量

c++ - 通过在每个元素上调用 name() 将 Class 的 vector 转换为 decltype(Class::name()) 的 vector

c++ - 多态性 : Compliation Error in the code. 需要解释

c# - 是否值得将一个小的 C# "engine"移植到 C++ 或类似的?

c# - 将 XSLT 文件包含到可执行文件中

visual-studio-2010 - visual studio 将动态链接更改为 win32 应用程序的静态链接

javascript - 使用 RaphaelJS 轮换 VML 组(似乎不起作用)

c++ - LSP 中的套接字更改

c++ - 将数组传递给线程