了解堆栈,堆和内存管理
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;
上面的代码是我试图用来了解堆栈和堆的测试函数的一小部分。
我不完全确定正确的顺序是什么。
这是我到目前为止:
delete []ip;
将堆中分配的内存移除到ip指针。 通过myFun的指针现在没有指向任何东西。 有人能够澄清我是否正确,并纠正我出错的地方? 此外,如果我试图继续使用ip之后,它会指向什么?
序列是正确的,除了一点:
删除[] ip; 将堆中分配的内存移除到ip指针。 通过myFun的指针现在没有指向任何东西。
指针不指向'Nothing'(即释放内存后未设置为nullptr
或0
)。 它只是指向现在释放内存的相同位置(即标记为由应用程序释放并且不能安全访问的内存)。 通过该指针访问内存会触发未定义的行为。
最后一个通知: 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?