了解堆栈、堆和内存管理

Understanding Stack, Heap and Memory Management

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,它会不会指向任何内容?

我相信一切都是正确的,我对以下要点有以下几点评论;

  • 删除[]ip;删除堆上分配给 ip 指针的内存。传递给 myFun 的指针现在指向 什么都没有。

不能保证指针指向 "nothing",一般建议(请参阅此答案下方评论中的说明)在您的 delete 调用时,您将指针初始化为 NULL,即 ip = NULL 以确保指针不指向任何内容(而不是指向未分配的内存)。

一切正确。但是请注意调用 delete 不会 delete 除了释放之前分配的内存之外的任何东西,这意味着你的指针包含你不能使用的地址(取消引用一个空闲块内存导致未定义的行为)。对于您的堆栈变量也是如此,与您的局部变量关联的内存不会被销毁而是被释放,因此您一定不要尝试使用它。堆栈和堆只是两种基本相同操作的内存管理方式(alloc/free)。

所以从技术上讲,你不能说你的指针指向任何东西,但它指向你无权使用的东西。

序列正确,除了一点:

The delete []ip; removes the memory allocated on the heap to the ip pointer. The pointer that got passed through to myFun now points to nothing.

指针未指向 'nothing'(即释放内存后未设置为 nullptr0)。它只是指向现在释放内存的同一位置(即标记为应用程序已释放且无法再安全访问的内存)。通过该指针访问内存将触发 undefined behavior.

最后一个通知:myfun 可能会按值或按引用获取指针。有差异,但你的句子仍然有效。