了解堆栈,堆和内存管理

int *ip = new int[10];
for (int i = 0; i<10; i++)
    *(ip+i) = i;

myfun(ip);  // assume that myfun takes an argument of
            //   type int* and returns no result

delete [] ip;

上面的代码是我试图用来了解堆栈和堆的测试函数的一小部分。

我不完全确定正确的顺序是什么。

这是我到目前为止:

  • 当指针ip被创建时,它指向由于“new”声明而在堆上创建的大小为10的新int数组。
  • 0-9被添加到数组0-9。
  • 指针现在传递给myfun,这意味着myfun具有指向堆上相同内存空间的指针。
  • delete []ip; 将堆中分配的内存移除到ip指针。 通过myFun的指针现在没有指向任何东西。
  • 一旦函数完成,ip变量被删除,因为它只是函数的本地。
  • 有人能够澄清我是否正确,并纠正我出错的地方? 此外,如果我试图继续使用ip之后,它会指向什么?


    序列是正确的,除了一点:

    删除[] ip; 将堆中分配的内存移除到ip指针。 通过myFun的指针现在没有指向任何东西。

    指针不指向'Nothing'(即释放内存后未设置为nullptr0 )。 它只是指向现在释放内存的相同位置(即标记为由应用程序释放并且不能安全访问的内存)。 通过该指针访问内存会触发未定义的行为。

    最后一个通知: myfun可能会根据价值或参考指标。 有差异,但你的句子仍然有效。


    我相信一切都是正确的,关于下面的要点,我有以下小小的评论;

  • 删除[] ip; 将堆中分配的内存移除到ip指针。 通过myFun的指针现在没有指向任何东西。
  • 不保证指针指向“无”,通常建议(请参阅下面的注释中的说明)在delete调用后,将指针初始化为NULL,即ip = NULL ,以确保指针指向没有(而不是指向未分配的内存)。


    一切都是正确的。 但要注意,调用delete不会删除任何内容,而是释放之前分配的内存,这意味着您的指针包含您不得使用的地址(将未释放的内存块的空闲块引用到未定义的行为)。 对于你的堆栈变量来说,与你的本地变量相关的内存不会被破坏,而是被释放,所以你不能尝试使用它。 堆栈和堆只是两种基本相同操作(alloc / free)的内存管理方式。

    所以技术上你不能说你的指针指向任何东西,但是它指向你没有授权使用的东西。

    链接地址: http://www.djcxy.com/p/13869.html

    上一篇: Understanding Stack, Heap and Memory Management

    下一篇: Do references get updated when Garbage Collectors move data in heap?