了解堆栈,堆和内存管理

时间:2015-05-18 09:22:37

标签: c++ pointers memory-management stack heap

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,它只是指向什么?

3 个答案:

答案 0 :(得分:3)

我相信一切都是正确的,关于以下要点,我有以下小说点;

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

无法保证指针指向&#34;没有&#34;,通常建议(请参阅此答案下方的评论中的说明)在delete之后调用,您将指针初始化为NULL,即ip = NULL,以确保指针指向任何内容(而不是指向未分配的内存)。

答案 1 :(得分:3)

除了一点之外,序列是正确的:

  

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

指针未指向“空”(即在释放内存后未设置为-(void)registerUserWithUser:(NSString*)name withPhone: (NSString*)number withPassword: (NSString*)password successHandler:(void (^)(BOOL isSuccess))myBlock{ /*** ** Do your logic here ** ** Then call the success handler block. ****/ BOOL isSuccess= FALSE; myBlock(isSuccess); } [self registerUserWithUser:@"xyz" withPhone:@"1234" withPassword:@"abcd" successHandler:^(BOOL success){ NSLog(@"success: %d", success); }]; )。它只指向现在释放内存的相同位置(即,标记为由应用程序释放并且不能再安全访问的内存)。通过该指针访问内存将触发undefined behavior

最后一个通知:nullptr可能会按值或按引用获取指针。虽然存在差异,但您的判决仍然有效。

答案 2 :(得分:1)

一切都是正确的。但要注意,调用delete并不会删除除释放先前分配的内存之外的所有内容,这意味着您的指针包含您不能使用的地址(取消引用免费)大块的内存会导致未定义的行为)。堆栈变量相同,与本地变量关联的内存不会被销毁但是会被释放,因此您不能尝试使用它。堆栈和堆只是两种内存管理方式,具有两个基本相同的操作(alloc / free)。

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