橦言无忌

一个不想改变世界的程序媛

cpp相关面试题

前言

c++的常见面试题,随时加更中~

加油~

chapter-1

问题1: incluede 后面使用双引号 “ “ 和尖括号 <> 的区别

参考:

预处理器发现 #include 指令后,就会寻找后跟的文件名并把这个文件的内容包含到当前文件中。被包含文件中的文本将替换源代码文件中的#include指令,就像你把被包含文件中的全部内容键入到源文件中的这个位置一样。

1
2
#include <stdio.h>  // 文件名放在尖括号中 
#include “mystuff.h” //文件名放在双引号中

尖括号< >括起来表明这个文件是一个工程或标准头文件。查找过程会检查预定义的目录,我们可以通过设置搜索路径环境变量或命令行选项来修改这些目录。

如果文件名用一对" "引号括起来则表明该文件是用户提供的头文件,查找该文件时将从当前文件目录(或文件名指定的其他目录)中寻找文件,然后再到标准位置寻找文件。

问题2:请说说new/delete与malloc/free的区别?

区别

  • new和delete是C++的关键字,是一种操作符,可以被重载

  • malloc和free是C语言的库函数,并且不能重载

  • malloc使用时需要自己显示地计算内存大小,而new使用时由编译器自动计算

1
2
int *q = (int *)malloc(sizeof(int) * 2);	//显示计算内存大小
int *p = new int[2]; //编译器会自动计算
  • malloc分配成功后返回的是void*指针,需要强制类型转换成需要的类型;而new直接就返回了对应类型的指针

  • new和delete使用时会分别调用构造函数和析构函数,而malloc和free只能申请和释放内存空间,不会调用构造函数和析构函数

代码示例

注意:delete和free被调用后,内存不会立即回收,指针也不会指向空,delete或free仅仅是告诉操作系统,这一块内存被释放了,可以用作其他用途。但是由于没有重新对这块内存进行写操作,所以内存中的变量数值并没有发生变化,这时候就会出现野指针的情况。因此,释放完内存后,应该把指针指向NULL。

1
2
3
4
5
6
7
8
9
10
11
12
13
int main() {
int *q = (int *)malloc(sizeof(int) * 2);
int *p = new int[2];
cout << "p = " << p << " q = " << q << endl;
free(p); //指针还没指向空
delete q; //同上
cout << "p = " << p << " q = " << q << endl;
return 0;
}
//上面程序运行的结果,可见第二次打印的时候p和q指针还没指向空
//这里不知为何编译器第二次打印的q和第一次不一样
// p = 000000000039B9B0 q = 000000000039B960
// p = 000000000039B9B0 q = 0000000000008123

参考资料

new 和 malloc free 和 delete 的区别

new/delete与malloc/free的区别与联系详解!

// 代码折叠