C/C++面试问题总结

1、指针多次释放会有什么结果?

  1. #include <stdio.h>  

  2. int main()  

  3. {  

  4.     int *p = (int*)malloc(sizeof(int)* 5);  

  5.     free(p);  

  6.     //p = NULL;  

  7.     free(p);  

  8.     return 0;  

  9. }  

如果是空指针,多次释放,编译时和运行时都通过。

如果是非控指针,多次释放,程序编译时通过,运行时报错。

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、不带头结点的单链表如何判空?

  1. 带头节点的情况下,链表空时还会存在一个节点(即头节点head),所以head不为空,head->next为空

  2. 不带头节点的情况下,链表空时,没有任何节点,head指向null

6、Linux下多线程的优化?

采用I/O多路复用和线程池优化多线程。

 

猜你喜欢

转载自blog.csdn.net/yx20130919/article/details/94033577