动态分配数组时的 C++ new 与 new[]

C++ new vs new[] when dynamically allocating arrays

在C++中我的理解是new应该用来动态分配单个变量,new[]应该用来动态分配变量数组。

然而,以下代码在 Xcode 中编译和运行良好:

#include <iostream>

int main()
{
    std::cout<<"Enter length of array: ";
    int length;
    std::cin>>length;
    int *mArray = new int;
    for(int i=0;i<length;++i)
        mArray[i] = i;
    for(int i =0;i<length;++i)
        std::cout<<mArray[i]<<std::endl;

    delete mArray;
    return 0;
}

为什么这行得通?如果它正在访问尚未分配的内存,它不会导致程序崩溃吗?

Why does this work? Shouldn't it cause the program to crash if it is accessing memory it hasn't been allocated?

这是 C++ 的速度和灵活性的代价 - 未定义的行为可能会在许多形式中观察到,其中一些确实看起来像您的程序正常运行。问题是这次出现 "work",下次可能会失败。或者明天当你更新你的编译器等时。你的工作是不要越界访问内存,而不是编译器来阻止它。尽管某些 compilers/environment 可能会提供额外的验证,使此类访问以一种方式失败,但 C++ 语言不需要它,因此您不能期望默认或根本没有它。

注意:越界访问未针对直接内存访问进行验证(在这种情况下通过原始指针),当您使用像 std::vector 这样的对象时,它可能会或可能不会验证边界,具体取决于您使用的方法或环境使用,你应该从文档中学习。