了解堆栈,堆和内存管理

Understanding Stack, Heap and Memory Management

本文关键字:内存 管理 堆栈 了解      更新时间:2023-10-16
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时,它指向由于"新"声明,在堆上创建的大小10的新int数组。
  • 0-9从0-9添加到数组中。
  • 该指针现在已转到MyFun,这意味着MyFun的指针指向堆上相同的内存空间。
  • delete []ip;将分配给IP指针的内存删除。传递到MyFun的指针现在一无所获。
  • 该函数完成后,删除了IP变量,因为它仅是该函数的本地。

有人可以澄清我是否正确,并在我出错的地方纠正我吗?另外,如果我尝试使用IP进行此操作,那就什么都没有指向?

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

delete [] ip;删除分配给IP指针的内存。传递到MyFun的指针现在一无所获。

指针并未指向"无"(即释放内存后未设置为nullptr0)。它只是指向现在已释放内存的同一位置(即由应用程序释放的内存,无法安全访问)。通过该指针访问内存将触发未定义的行为。

最后一个通知:myfun可以按值或参考将指针采用。有差异,但您的句子仍然有效。

我相信一切都是正确的,我对以下子弹点有以下小评论;

  • delete [] ip;删除分配给IP指针的内存。转到MyFun的指针现在指向什么都没有。

不能保证指针指向"无",通常建议使用(请参阅下面的评论中的澄清),在delete调用后,您可以初始化指向Null的指针,即ip = NULL为了确保指针指向什么都没有指向(而不是指向未分配的内存)。

一切都正确。但是请注意,调用delete delete 除了免费的内存,这意味着您的指针包含您不得使用的地址(请删除一大堆内存的leeads以使其不确定的行为)。对于您的堆栈变量,与本地变量关联的内存不会被破坏,而是释放,因此您不得尝试使用它。堆栈和堆只是两个基本相同操作(Alloc/Free)的内存管理方式。

因此,从技术上讲,您不能说您的指针指向任何东西,但它指出了您无权使用的东西。