回复:4. 释放内存两次
为了扩展此技巧,在调用 free() 将内存释放回堆之后,应立即将指针设置为 NULL。
不将指针设置为 NULL 会导致两个潜在的问题
1) 在同一地址上调用 free() 两次,导致堆损坏。
2) 取消引用指向已释放内存的指针,该内存可能正在被程序的其他部分使用,可能会损坏数据或检索到不正确的数据。
解决方案很简单;
要么总是
//...free(array);array = NULL; //...
许多程序员忘记这样做,或者更好的是
void *free2(void *ptr) // 或其他名称 {free(ptr);return NULL; }
并始终如一地使用新函数,如
array = free2(array);
这可以解决上述两个问题。
取消引用 NULL 指针应导致分段错误,表明指针存在问题,并且对 NULL 指针调用 free() 无效。
在“循环直到我猜出随机数”部分中,我将使用 while 循环而不是 do-while 循环来编写循环代码。人们普遍认为,如果可能的话,应避免使用 do-while 循环,我对此表示赞同。 C++ 也是如此!
作者评论
回复:4. 释放内存两次
为了扩展此技巧,在调用 free() 将内存释放回堆之后,应立即将指针设置为 NULL。
不将指针设置为 NULL 会导致两个潜在的问题
1) 在同一地址上调用 free() 两次,导致堆损坏。
2) 取消引用指向已释放内存的指针,该内存可能正在被程序的其他部分使用,可能会损坏数据或检索到不正确的数据。
解决方案很简单;
要么总是
//...
free(array);
array = NULL;
//...
许多程序员忘记这样做,或者更好的是
void *free2(void *ptr) // 或其他名称
{
free(ptr);
return NULL;
}
并始终如一地使用新函数,如
array = free2(array);
这可以解决上述两个问题。
取消引用 NULL 指针应导致分段错误,表明指针存在问题,并且对 NULL 指针调用 free() 无效。
在“循环直到我猜出随机数”部分中,我将使用 while 循环而不是 do-while 循环来编写循环代码。人们普遍认为,如果可能的话,应避免使用 do-while 循环,我对此表示赞同。 C++ 也是如此!