了解堆栈、堆和内存管理
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 时,它指向由于 "new" 声明而在堆上创建的大小为 10 的新 int 数组。
- 0-9从0-9加入数组。
- 指针现在传递给 myfun,这意味着 myfun 有一个指针指向堆上的同一内存 space。
delete []ip;
移除堆上分配给ip指针的内存。传递给 myFun 的指针现在指向任何内容。
- 函数完成后,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'(即释放内存后未设置为 nullptr
或 0
)。它只是指向现在释放内存的同一位置(即标记为应用程序已释放且无法再安全访问的内存)。通过该指针访问内存将触发 undefined behavior.
最后一个通知:myfun
可能会按值或按引用获取指针。有差异,但你的句子仍然有效。
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 有一个指针指向堆上的同一内存 space。
delete []ip;
移除堆上分配给ip指针的内存。传递给 myFun 的指针现在指向任何内容。- 函数完成后,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'(即释放内存后未设置为 nullptr
或 0
)。它只是指向现在释放内存的同一位置(即标记为应用程序已释放且无法再安全访问的内存)。通过该指针访问内存将触发 undefined behavior.
最后一个通知:myfun
可能会按值或按引用获取指针。有差异,但你的句子仍然有效。