gpt4 book ai didi

c++ - 为什么尝试更改 _arr[3] 时没有抛出异常?

转载 作者:搜寻专家 更新时间:2023-10-31 01:25:16 25 4
gpt4 key购买 nike

我有这段代码,它应该在尝试到达 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++ 遵循“不要为你不需要的东西买单”的哲学(尽管有些异常(exception)违反了它)。在超出数组边界时抛出异常需要进行显式检查。但是,如果您已经知道不能超过?

for(size_t i = 0; i < sizeof(someArray)/sizeof(*someArray); ++i)
someArray[i] = 0; // i CANNOT be outside array boundaries, so why check???

这使 C++ 变得更快,但另一方面,如果它们 是必需的(就像在您的访问器函数中一样),则将这些检查强加给。正是出于这个原因,std::vector 提供了 operator[](未选中)和 at(已选中,超出当前大小时抛出异常) .

如果您越界访问数组,就会调用未定义的行为。您可能会逃脱,因为可能有一些额外的内存与您的数组一起分配。如果您超出数组边界 足够远,您可能会看到与省略构造函数时相同的“异常”(使指针未初始化为某个随机值)。实际上,这在 C++ 意义上并不是一个异常(exception)。这是一个访问冲突(读取一个不存在的或您的程序无法访问的内存地址),很可能被您的操作系统检测到,它通过一些适当的方式处理该问题(例如 linux 向您的程序发送 SIG_SEGV 信号)。

关于c++ - 为什么尝试更改 _arr[3] 时没有抛出异常?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57110853/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com