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;
上面的代码是测试函数的一小部分,我试图用它来了解堆栈和堆。
我不完全确定正确的序列是什么。
这就是我到目前为止:
delete []ip;
将堆上分配的内存删除到ip指针。传递给myFun的指针现在什么都没有。有人能够澄清我是否正确并纠正我哪里出错了?此外,如果我之后尝试继续使用ip,它只是指向什么?
答案 0 :(得分:3)
我相信一切都是正确的,关于以下要点,我有以下小说点;
无法保证指针指向&#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)。
从技术上讲,你不能说你的指针指向任何东西,但它指的是你无权使用的东西。