不久前有人告诉我,在 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/