1、指针多次释放会有什么结果?
-
#include <stdio.h>
-
int main()
-
{
-
int *p = (int*)malloc(sizeof(int)* 5);
-
free(p);
-
//p = NULL;
-
free(p);
-
return 0;
-
}
如果是空指针,多次释放,编译时和运行时都通过。
如果是非控指针,多次释放,程序编译时通过,运行时报错。
2、free指针后不置空可以吗?
一个指针释放后不置空的后果:
free(p):释放指针p后,p是一个非法的指针,不可以访问它。如果代码很长,误以为p合法,直接访问,有可能会造成程序崩溃。
不置空的话,在后面无法检测指针的合法性。我们在平时编程时,对空指针很容易检测(if(NULL==p)),但是对于非法指针p不为空,我们是无法检测到的。
防止对一个已经释放的指针多次释放造成程序崩溃,但是对一个null指针多次释放是合法的。
所以,我们在free后一定要将指针置空。
解决办法——一劳永逸
防止我们忘记,可以在程序开始用宏定义一个函数:
#define SAFE_FREE(p) \
if
(p) \
{ \
free
(p); \
p = NULL; \
}
这样我们就可以使用SAFE_FREE防止我们忘记置空。
不置空的危害性是非常大的,所以一定要置空。
3、在C语言中如何避免野指针?
在C语言中,在free或者delete之后,将指针置空,能有效地避免野指针。
因为free/delete只是删除由程序员自己分配的内存空间,但是指针本身还是要占用内存空间的,它可以指向新的内容。
比如:
char *ch = new char [10];
……
delete [] ch;
之后,再对ch进行操作就会提示内存访问错误,"violation access…"
所以把不用的指针置为NULL是可取的。
4、重复多次fclose一个打开过一次的文件指针FILE fp,会有什么结果?
fclose要释放与文件相关连的缓存,释放文件符号等。
你对同一文件指针fp多次fclose会引起对同一内存的多次free,故而出错。
5、不带头结点的单链表如何判空?
-
带头节点的情况下,链表空时还会存在一个节点(即头节点head),所以head不为空,head->next为空
-
不带头节点的情况下,链表空时,没有任何节点,head指向null
6、Linux下多线程的优化?
采用I/O多路复用和线程池优化多线程。