【发布时间】:2019-07-19 10:47:38
【问题描述】:
我有这段代码,它应该在尝试到达 Container 中 _arr 的第三个索引时抛出异常。它没有抛出异常,我不明白为什么。
移除构造函数会导致它抛出异常,这真的很奇怪。
class X {
public:
X(int x) { std::cout << x - 1; }
};
template <class T, int d=3>
class Container {
T* _arr;
public:
Container():_arr(new T[d]){ }
void setItemAtIndex(T item, int index) { _arr[index] = item; }
X getItemAtIndex(int index) { return _arr[index]; }
};
int main()
{
Container<int> container;
for (int i = 1;i < 4;i++) {
container.setItemAtIndex(i, i);
X x = container.getItemAtIndex(i);
}
return 0;
}
我预计会抛出异常,但它实际上输出“012”。
【问题讨论】:
-
C++ 不检查数组边界。您需要在
setItemAtIndex和getItemAtIndex方法中自行添加校验码。 -
未定义的行为不会引发异常。或者至少,这不是一个明确的原因。未定义的行为原则上可以做任何事情。
-
您的 setItemAtIndex 和 getItemAtIndex 缺少检查索引是否在范围内,如果不在范围内则抛出异常。
-
感谢您的回复。考虑到我在 Visual Studio 中遇到的情况,我认为更改未专门分配给数组(索引 3)的内存将是运行时错误。
标签: c++