Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/136.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 为什么在尝试更改[3]时没有引发异常?_C++ - Fatal编程技术网

C++ 为什么在尝试更改[3]时没有引发异常?

C++ 为什么在尝试更改[3]时没有引发异常?,c++,C++,我有这段代码,它应该在试图到达容器中的_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]){ } v

我有这段代码,它应该在试图到达容器中的_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;
}    
X类{
公众:

x(int x){sd::cOut C++中没有规则表示在访问数组时必须抛出异常。
删除构造函数会导致它抛出异常,这真的很奇怪。未定义的行为是不可预测的。我想您的系统最好设置为通过未初始化的指针捕捉访问,而不是数组上的越界访问。

C++遵循这一原理(尽管有些异常违反了它)“不要为你不需要的东西付费”。对超出数组边界的情况抛出异常需要进行显式检查。但如果你已经知道不能超过

for(size_t i=0;i
<>这使C++快速,但另一方面,如果需要的话,就把这些检查强加给你(就像在你的访问器函数中一样)。
如果访问超出范围的数组,则会调用未定义的行为。您可能会侥幸逃脱,因为可能会有一些额外的内存与数组一起分配。如果您远远超出数组范围,您可能会看到与忽略构造函数时相同的“异常”(使指针在某个随机值处未初始化)实际上,它在C++意义上不是例外。它是访问冲突(读取内存地址不存在或不能访问程序),最可能是由操作系统检测到的,它通过适当的方式处理问题(例如Linux向程序发送SIGY-SeGV信号)。.

C++不检查数组边界。您需要在
setItemAtIndex
getItemAtIndex
方法中添加自己的检查代码。未定义的行为不会引发异常。或者至少,这不是一个明确的原因。未定义的行为原则上可以做任何事情。您的setItemAtIndex和getItemAtIndex缺少对异常的检查查看索引是否在范围内,如果不在范围内,则引发异常。感谢您的响应。我想更改未指定分配给数组的内存(索引3)这可能是一个运行时错误,考虑到这正是我在Visual Studio中所经历的。谢谢你的回答。另一个简单的问题,访问冲突不应该导致运行时错误吗?@atter好的,当读取或分配指针时,是在程序执行期间,不是吗?此外,指针的有效性可能会更高在程序执行过程中的任何时候进行更改,编译器应该如何检测?只是读取或写入无效地址本身就是错误,是的,是运行时错误。。。
for(size_t i = 0; i < sizeof(someArray)/sizeof(*someArray); ++i)
    someArray[i] = 0; // i CANNOT be outside array boundaries, so why check???