深信服面试准备:C/C++软件开发工程师(云计算、网络安全方向)

9.重载和重写的区别:

重载是静态多态,重写是动态多态

只不过重载是通过同名函数的不同参数类型,参数个数实现不同的功能,而且这是在编译的过程中发生的;

重写是通过虚函数的形式实现不同对象同名函数实现不同的功能,在程序运行的过程中发生。

10.new,malloc, free和delete的区别:

首先,new/delete是C++的关键字,而malloc/free是C语言的库函数,后者使用必须指明申请内存空间的大小,对于类类型的对象,后者不会调用构造函数和析构函数

malloc/free是C语言开辟空间和释放空间的函数。

而new/delete是C++开辟空间和释放空间的运算符。

malloc/free与new/delete的相同点:

1.他们都是用来开辟或释放出一块空间;

2.在使用malloc与new的时候必须要与free和delete配对使用,否则会造成内存泄漏。

malloc/free与new/delete的不同点:

1.malloc与free是标准C库函数,而new与delete是C++里面的运算符;

2.new是用来创造对象的,执行流程是先申请内存,然后使用类的构造函数来初始化对象,在调用delete时也一样是先调用析构函数,然后再释放内存空间,而malloc是直接开辟出一块空间,并不会为对象初始化;

3.malloc申请空间后返回的是一个void*类型的指针,我们要在使用时将其强转为我们要使用的类型,而new返回的是我们所创建对象类型的指针。

4.malloc申请空间时无法对数据初始化,而new会调用构造函数初始化。

对于不同的类型,new和delete的处理方式是不同的:

内置类型:

如果申请的是内置类型的空间,new和malloc,delete和free基本类似;

不同之处:

new在申请空间失败时会抛异常;

malloc在申请空间失败时会返回NULL;

自定义类型:

new的原理:

调用operator new函数申请空间;

在申请的空间上执行构造函数,完成对象的构造; 实际内部是malloc函数

delete的原理:实际内部是free函数

在空间上执行析构函数,完成对象中资源的清理工作;

调用operator delete函数释放对象的空间;

new[N]的原理:

调用operator new[]函数,在operator new[]中实际调用operator new函数完成N个对象空间的申请;

在申请的空间上执行N次构造函数;

delete[N]的原理:

在释放的对象空间上执行N次析构函数,完成N个对象中资源的清理;

调用operator delete[]释放空间,实际在operator delete[]中调用operator delete来释放空间;

malloc分配的时候需要指定内存大小,为什么free的时候不需要指定?

当调用malloc(size)时,实际分配的内存大小大于size字节,这是因为在分配的内存区域头部有类似于
struct control_block {
unsigned size;
int used;
};
这样的一个结构,如果malloc函数内部得到的内存区域的首地址为void *p,那么它返回给你的就是p + sizeof(control_block),而调用free(p)的时候,该函数把p减去sizeof(control_block),然后就可以根据((control_blcok*)p)->size得到要释放的内存区域的大小。这也就是为什么free只能用来释放malloc分配的内存,如果用于释放其他的内存,会发生未知的错误。

11.指针和引用的区别,指针和引用作为形参,哪一个效率更高一点:

1.指针有自己的一块空间,而引用只是一个别名;

2.使用sizeof看一个指针的大小是4(32位系统),64位下是8,而引用则是被引用对象的大小,但是作为参数传入函数的时候会退化成指针。

具体如下图所示:

3.指针可以被初始化为NULL,而引用必须被初始化且必须是一个已有对象 的引用;

4.作为参数传递时,指针需要被解引用才可以对对象进行操作,而直接对引 用的修改都会改变引用所指向的对象;

5.可以有const指针,但是没有const引用;

6.指针在使用中可以指向其它对象,但是引用只能是一个对象的引用,不能 被改变;

7.指针可以有多级指针(**p),而引用至多一级;

8.指针和引用使用++运算符的意义不一样,如图:指针++是去下个地址,引用++是本身++。

9.如果返回动态内存分配的对象或者内存,必须使用指针,引用可能引起内存泄露。

猜你喜欢

转载自blog.csdn.net/weixin_42067304/article/details/111313108