了解堆栈,堆和内存管理
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时,它指向由于"新"声明,在堆上创建的大小10的新int数组。
- 0-9从0-9添加到数组中。
- 该指针现在已转到MyFun,这意味着MyFun的指针指向堆上相同的内存空间。
-
delete []ip;
将分配给IP指针的内存删除。传递到MyFun的指针现在一无所获。 - 该函数完成后,删除了IP变量,因为它仅是该函数的本地。
有人可以澄清我是否正确,并在我出错的地方纠正我吗?另外,如果我尝试使用IP进行此操作,那就什么都没有指向?
序列是正确的,除了一个点:
delete [] ip;删除分配给IP指针的内存。传递到MyFun的指针现在一无所获。
指针并未指向"无"(即释放内存后未设置为nullptr
或0
)。它只是指向现在已释放内存的同一位置(即由应用程序释放的内存,无法安全访问)。通过该指针访问内存将触发未定义的行为。
最后一个通知:myfun
可以按值或参考将指针采用。有差异,但您的句子仍然有效。
我相信一切都是正确的,我对以下子弹点有以下小评论;
- delete [] ip;删除分配给IP指针的内存。转到MyFun的指针现在指向什么都没有。
不能保证指针指向"无",通常建议使用(请参阅下面的评论中的澄清),在delete
调用后,您可以初始化指向Null的指针,即ip = NULL
为了确保指针指向什么都没有指向(而不是指向未分配的内存)。
一切都正确。但是请注意,调用delete
delete 除了免费的内存,这意味着您的指针包含您不得使用的地址(请删除一大堆内存的leeads以使其不确定的行为)。对于您的堆栈变量,与本地变量关联的内存不会被破坏,而是释放,因此您不得尝试使用它。堆栈和堆只是两个基本相同操作(Alloc/Free)的内存管理方式。
因此,从技术上讲,您不能说您的指针指向任何东西,但它指出了您无权使用的东西。
相关文章:
- 当vector是tje全局变量时,c++中vector的内存管理
- 我有一个线程 1:EXC_BAD_ACCESS(代码 = 1,地址 = 0x8)错误.我认为这是由于内存管理不好.我可以
- C++将字符串传递给 C 库以进行内存管理
- 从函数返回时C++内存管理
- 函数指针和 lambda 的内存管理
- 自定义内存管理器在发布模式下工作正常,但在调试模式下则不然
- C++中的内存管理
- C和C++中的内存管理有什么区别
- 字符 * 未从重载运算符或内存管理问题正确返回
- 如何在源代码中使用执行策略检测 C++17 的扩展内存管理算法的可用性?
- 底层指针和内存管理
- 智能指针,避免使用QNetworkAccessManager时进行手动内存管理
- c++中的内存管理问题
- 使用矢量时的内存管理
- 循环和内存管理中的指针算术C++?
- C++堆栈内存管理问题
- C 内存管理中的课程如何管理 - 研究
- 不可变数据模型的内存管理
- C++ 使用数组初始化时的 STL 向量内存管理
- SFML 纹理内存管理