在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;
}
为什么这样做?如果程序正在访问尚未分配的内存,是否应该导致程序崩溃?
答案 0 :(得分:1)
为什么这样做?如果程序正在访问尚未分配的内存,是否会导致程序崩溃?
这是C ++的速度和灵活性的代价 - 可以通过多种形式观察到未定义的行为,其中一些看起来非常像您的程序正常工作。问题似乎是&#34;工作&#34;这一次,下次可能会失败。或者明天当你更新你的编译器等时。你的工作不是访问内存超出界限,而不是编译器来阻止它。虽然某些编译器/环境可能会提供额外的验证,使这种访问以另一种方式失败,但C ++语言并不要求它,因此您不能指望默认情况下或根本不需要它。
注意:超出边界访问权限未经过直接内存访问验证(在这种情况下通过原始指针),当您使用std::vector
之类的对象时,它可能会或可能不会验证边界,取决于您使用的方法或环境,你应该从文档中学习。