在堆上定义内置类型

时间:2014-12-15 07:17:34

标签: c++ heap heap-memory built-in

我在堆上声明了一个像这样的整数数组

int* a = new int[100];

然后我像这样初始化它

for(int i=0; i<100; i++)
    a[i] = i;

效果很好,但后来我尝试了这个

for(int i=0; i<1000; i++)
    a[i] = i;

这也很完美。因为我是c ++的新手,任何人都可以解释上面这个声明中的问题,因为我认为整数数组的声明不正确或者可能是其他什么?

6 个答案:

答案 0 :(得分:2)

当您在数组末尾写入时,您会得到未定义的行为。重要的词是 undefined 。它可能取决于编译器,环境,编译器标志,......

在你的例子中它起作用是因为你在一个可访问的内存上写了,但你可以(非限制性列表):

  • 尝试访问不可用内存并获取分段违规
  • 尝试编写只读内存
  • ovewrite属于您自己代码的其他变量
  • 擦除你自己的堆栈

但由于它是未定义的行为,没有什么能保证会发生这种情况。您只知道必须从不这样做。

最近(体面的操作系统)你不能崩溃系统,但只有你自己的应用程序,除非你运行管理员或root权限,在什么情况下会发生任何事情。但是对于像MS / DOS(或某些嵌入式系统)这样的旧系统,没有应用程序间保护,这样的程序可能会发生系统崩溃。

答案 1 :(得分:1)

您在堆上创建了一个100 ints数组。但是你正在访问记忆。 C ++并没有阻止你这样做,但它是一个未定义的行为,你可能会遇到崩溃,其他程序使用的内存损坏等。

答案 2 :(得分:0)

您将变量声明为100.但是您要将值分配为1000。

int* a = new int[100];

将其设为1000。

编辑:

如果您正在访问未为该变量声明的内存,则会出现分段错误。有些时候只有它才能正常工作。

答案 3 :(得分:0)

你只是分配一些内存,即使你没有权限。它可以工作。但是,我确信,程序本身会在某些时候中断。

答案 4 :(得分:0)

C和c ++不检查那种溢出。你应该永远不会让这种情况发生。毋庸置疑,这是C和C ++因无情而闻名的原因的1/2。

你很幸运,程序没有暴力崩溃。但它很快就会被其他记忆粉碎。

答案 5 :(得分:0)

从技术上讲,“a”只是一个指针(如你所声明的那样)。

然后你已经指出某个数组的开始(在这种情况下在堆上)。

然后您正在递增指针并设置值。编译器根本不会有这个问题,因为“a”不是数组,而是指向编译器被告知的内存位的指针是一个整数。所以你可以让你的循环继续,只要你想要,但它将开始覆盖用于其他目的的内存,可能最终在途中某处出现seg故障......或者其他一些奇怪的行为:o