LeetCode C++基础面试题汇总附答案(三)

目录

前言

面试题及答案

1. C++ 是不是类型安全的?

2. main 函数执行之前,还会执行什么代码?

3. 描述内存分配方式以及它们的区别?

4. 分别写出 bool, int, float, 指针类型的变量 a 与“零”的比较语句。

5. 请说出 const 与 #define 相比,有何优点?

6. 引用与指针有什么区别?

7. 全局变量和局部变量有什么区别?是怎么实现的?操作系统和编译器是怎么知道的?

8. 类对象的大小受哪些因素影响?

9. C++ 堆和栈的区别?

10. 堆和自由存储区的区别?

11. 什么是内存泄漏?面对内存泄漏和指针越界,你有哪些方法?你通常采用哪些方法来避免和减少这类错误?


前言

        这里整理了leetCode C++的基础面试第三部分,希望对大家有所帮助 

面试题及答案

1. C++ 是不是类型安全的?


不是。两个不同类型的指针之间可以强制转换(用reinterpret cast)。C#是类型安全的。


2. main 函数执行之前,还会执行什么代码?


全局对象的构造函数会在main函数之前执行。


3. 描述内存分配方式以及它们的区别?


1)从静态存储区域分配。内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在。例如全局变量,static 变量。
2)在栈上创建。在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束时这些存储单元自动被释放。栈内存分配运算内置于处理器的指令集。
3)从堆上分配,亦称动态内存分配。程序在运行的时候用malloc 或new 申请任意多少的内存,程序员自己负责在何时用free 或delete 释放内存。动态内存的生存期由程序员决定,使用非常灵活,但问题也最多。


4. 分别写出 bool, int, float, 指针类型的变量 a 与“零”的比较语句。


1. bool : if(!a) or if(a)
2. int : if(a == 0)
3. float : const EXPRESSION EXP = 0.000001
4. if (a < EXP && a >-EXP)
5. pointer : if(a != NULL) or if(a == NULL)


5. 请说出 const 与 #define 相比,有何优点?


const作用:定义常量、修饰函数参数、修饰函数返回值三个作用。被const修饰的东西都受到强制保护,可以预防意外的变动,能提高程序的健壮性。
1)const 常量有数据类型,而宏常量没有数据类型。编译器可以对前者进行类型安全检查。而对后者只进行字符替换,没有类型安全检查,并且在字符替换可能会产生意料不到的错误。
2)有些集成化的调试工具可以对const 常量进行调试,但是不能对宏常量进行调试。


6. 引用与指针有什么区别?


引用必须被初始化,指针不必。
引用初始化以后不能被改变,指针可以改变所指的对象。
不存在指向空值的引用,但是存在指向空值的指针。


7. 全局变量和局部变量有什么区别?是怎么实现的?操作系统和编译器是怎么知道的?


生命周期不同:
全局变量随主程序创建和创建,随主程序销毁而销毁;局部变量在局部函数内部,甚至局部循环体等内部存在,退出就不存在;
使用方式不同:
通过声明后全局变量程序的各个部分都可以用到;局部变量只能在局部使用;分配在栈区。
内存分配位置不同:
全局变量分配在全局数据段并且在程序开始运行的时候被加载。局部变量则分配在堆栈里面 。


8. 类对象的大小受哪些因素影响?


类的非静态成员变量大小,静态成员不占据类的空间,成员函数也不占据类的空间大小;
内存对齐另外分配的空间大小,类内的数据也是需要进行内存对齐操作的;
虚函数的话,会在类对象插入vptr指针,加上指针大小;
当该该类是某类的派生类,那么派生类继承的基类部分的数据成员也会存在在派生类中的空间中,也会对派生类进行扩展。


9. C++ 堆和栈的区别?


1)堆存放动态分配的对象——即那些在程序运行时动态分配的对象,比如 new 出来的对象,其生存期由程序控制;
2)栈用来保存定义在函数内的非static对象,如局部变量,仅在其定义的程序块运行时才存在;
3)静态内存用来保存static对象,类static数据成员以及定义在任何函数外部的变量,static对象在使用之前分配,程序结束时销毁;
4)栈和静态内存的对象由编译器自动创建和销毁

想要回答更详细参考:基础面试题:堆和栈的区别


10. 堆和自由存储区的区别?


总的来说,堆是C语言和操作系统的术语,是操作系统维护的一块动态分配内存;自由存储是C++中通过new与delete动态分配和释放对象的抽象概念。他们并不是完全一样。
从技术上来说,堆(heap)是C语言和操作系统的术语。堆是操作系统所维护的一块特殊内存,它提供了动态分配的功能,当运行程序调用malloc()时就会从中分配,稍后调用free可把内存交还。而自由存储是C++中通过new和delete动态分配和释放对象的抽象概念,通过new来申请的内存区域可称为自由存储区。基本上,所有的C++编译器默认使用堆来实现自由存储,也即是缺省的全局运算符new和delete也许会按照malloc和free的方式来被实现,这时藉由new运算符分配的对象,说它在堆上也对,说它在自由存储区上也正确。


11. 什么是内存泄漏?面对内存泄漏和指针越界,你有哪些方法?你通常采用哪些方法来避免和减少这类错误?


用动态存储分配函数动态开辟的空间,在使用完毕后未释放,结果导致一直占据该内存单元即为内存泄露。
1). 使用的时候要记得指针的长度.
2). malloc的时候得确定在那里free.
3). 对指针赋值的时候应该注意被赋值指针需要不需要释放.
4). 动态分配内存的指针最好不要再次赋值.
5). 在C++中应该优先考虑使用智能指针.

上一篇:LeetCode C++基础面试题汇总附答案(二)

下一篇:LeetCode C++基础面试题汇总附答案(四) 

参考:
链接:https://leetcode.cn/leetbook/read/da-han-hou-duan-gang-ti-mu-he-ji-shang/nihjj2/
 

猜你喜欢

转载自blog.csdn.net/lejian/article/details/129160802