目录
-
New失败会怎样?
C++ 里,如果 new 分配内存失败,默认是抛出异常的。
如果new分配成功,p == 0 就绝对不会成立;而如果分配失败了,也不会执行 if ( p == 0 ),因为分配失败时,new 就会抛出异常跳过后面的代码。如果你想检查 new 是否成功,应该捕捉异常:
try {
int* p = new int[SIZE];
// 其它代码
} catch ( const bad_alloc& e ) {
return -1;
}
当然,标准 C++ 亦提供了一个方法来抑制 new 抛出异常,而返回空指针:
int* p = new (std::nothrow) int; // 这样如果 new 失败了,就不会抛出异常,而是返回空指针
if ( p == 0 ) // 如此这般,这个判断就有意义了
return -1;
// 其它代码
-
C++里有GC机制吗,有哪些?
- 引用计数算法
- Mark & Sweep 算法
- 节点复制算法
- 分代回收(前三个方法的融合)
-
谈谈多态?
C++的多态性用一句话概括就是:在基类的函数前加上virtual关键字,在派生类中重写该函数,运行时将会根据对象的实际类型来调用相应的函数。如果对象类型是派生类,就调用派生类的函数;如果对象类型是基类,就调用基类的函数。
C++ 支持两种多态性:编译时多态性,运行时多态性。
a、编译时多态性(静态多态):通过重载函数实现
b、运行时多态性(动态多态):通过虚函数实现。
多态性是一个接口多种实现,是面向对象的核心,分为类的多态性和函数的多态性。多态用虚函数来实现,结合动态绑定.
-
什么是哈希冲突?哈希冲突怎么解决?
hash冲突:就是根据key即经过一个函数f(key)得到的结果的作为地址去存放当前的key value键值对(这个是hashmap的存值方式),但是却发现算出来的地址上已经有人先来了。就是说这个地方要挤一挤啦。这就是所谓的hash冲突啦
hash冲突解决:
- STL 中 HashMap 解决冲突一般采用链表法,其特点是利用空间换时间,查找复杂度能达到常数级别。
- 通常还有一种解决冲突的办法,开放地址法,分别有线性探测(Linear probing)、二次探测(Quadratic probing)、二次哈希(Double hashing)三种方式。
链表法的解析:
开放地址法的解析:
没懂。
-
为什么内存不对齐会引起程序崩溃
- 一般risc的芯片,都会要求字节必须对齐,否则就会有问题。
- 但是x86的芯片没有问题,当内存地址不对齐时,芯片会自动分两次读取数据,只是影响效率,不会有程序崩溃的危险。
内存对齐的好处:我们都知道内存对齐可以提高效率,具体来说就是减少内存访问次数
平台原因(移植原因):不是所有的硬件平台都能访问任意地址上的任意数据,某些硬件平台只能在某些地址处取某些特定类型的数据,否则抛出硬件异常.
硬件原因:经过内存对齐之后,CPU的内存访问速度大大提升。具体原因接下来举例解释
解析:
- 当数据从0字节开始的时候,直接将0-3四个字节完全读取到寄存器,结算完成了。
- 当数据从1字节开始的时候,问题很复杂,首先先将前4个字节读到寄存器,并再次读取4-7字节的数据进寄存器,接着把0字节,4,6,7字节的数据剔除,最后合并1,2,3,4字节的数据进寄存器,对一个内存未对齐的寄存器进行了这么多额外操作,大大降低了CPU的性能。
-
数组相加得到m(手撕代码)
-
判断是否是子串(手撕代码)