一、new和malloc之间的区别(表格参考代码随想录 (programmercarl.com)C++八股)
new/delete | malloc/free | |
本质属性 | 运算符 | 标准库函数 |
内存分配 | 自动计算 | 手工计算 |
类型安全 | 是(int类型指针指向float会报错) | 不是(malloc类型转换为int分配double大小的空间不会报错) |
关系 | new封装了malloc | |
其他 | 会调用构造和析构 | 只分配和释放内存 |
分配失败报bad_alloc异常 | 分配失败报null | |
返回定义时类型的指针 | 返回void* 指针需要类型转换 |
二、指针和引用
指针:存放某个对象的地址,本身就是变量,也有地址,可以有指向指针的指针。
引用:变量的别名,必须初始化,不存在指向空值的引用。
三、move,右值引用、移动构造函数(prime P473)
右值引用:&&,只能绑定一个将要销毁的对象,左值表示对象的身份,右值表示对象的值,变量是左值,字符常量是右值。
int &&rr1 = 42; // 是右值字符常量
int &&rr2 = rr1; // 不是右值表达式rr1是左值
move:可以获得绑定到左值上的右值引用,调用move意味着除了赋值和销毁,不再使用。
int &&rr3 = std::move(rr1); // ok
移动构造函数 :第一个参数是右值引用,额外参数有默认实参。移动构造函数不分配任何内存,接管内存后完成移动操作,移动后源对象将被销毁。
四、堆区和栈区的区别
堆:动态申请内存,从低地址到高地址增长。
栈:存储局部变量,参数值,从高地址向低地址连续空间。
五、数组和链表的区别,数组插入元素时间复杂度
数组:内存空间地址连续,提供随机访问,下标从0开始,从栈分配内存,查询简单。插入删除难。插入时间复杂度(头部O(n),尾部O(1))。
链表:不按序存储,不可以随机访问,从堆上分配内存,查询难,插入删除简单。
六、十大排序算法代码及原理