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被创建时,它指向一个新的int数组,大小为10,由于“new”声明而在堆上创建。 - 从0到9将添加到数组中。 - 现在将指针传递给myfun,这意味着myfun具有指向堆上相同内存空间的指针。 -
delete []ip;
删除在堆上分配给ip指针的内存。传递到myFun的指针现在指向无效内存。
- 一旦函数完成,ip变量将被删除,因为它只是函数本地变量。请问是否有人能够澄清我是否正确,并纠正我哪里出错了?如果我之后继续使用ip,它会指向无效内存吗?
esp
)只是下移。下一个被调用的函数将再次将其上移,如此往复。 - mangustanew
在 自由存储区 上分配内存,而不是堆上,但这基本上是一个概念上的区别。 - TartanLlamadelete[]
的地址上的项目通常会一直保存在那里,直到另一次动态内存分配(另一个对于相同基础内存使用new
或者malloc
的调用)返回完全或部分重叠的内存区域(或者动态内存分配库本身决定将该内存用于某些内部管理信息)。除非分配库恰好从另一个new
或malloc
给您另一个指向它的指针,否则您不得再次访问它。在解引用之前应重新分配指针。 - Tony Delroy