C/C++面试(三)

1. 栈内存和堆内存的区别?为什么要区分?函数里面的变量是哪一种内存?

栈内存由系统内存管理器自动创建和释放。

堆内存可以在运行时动态申请和释放。

区分是因为栈内存虽然存取速度很快,但固定大小,而在堆内存中则可以动态申请内存。

函数里的变量(局部变量)、形参、临时变量使用的是栈内存。

2.malloc和new的区别?

malloc是C语言标准库的一个内存分配函数,作用是申请指定大小的空间,并返回一个void指针。而C++中的new是一个运算符,它除了内存分配还有调用对象的构造函数进行初始化,并返回对应对象的指针。

3. 以下代码的问题在哪里?

void GetMemory(char *p){
    p=(char*)malloc(100);
}
void Test(void){
    char *str=NULL;
    GetMemory(str);
    strcpy(str,"hello world");
    print(str);
}
int main(){
    Test();
}

上图并没有成功将分配的内存地址分配给Test函数中的str,因为GetMemory的形参是原参数的拷贝,函数中是对这个拷贝进行修改。正确的写法应该是

void GetMemory(char **p){
    *p=(char*)malloc(100);
}

//or
void GetMemory(char*& p){
    p=(char*)malloc(100);
}

4.智能指针?

unique_ptr:独占指针,只允许一个指针指向目标地址

share_ptr:共享指针,运行多个智能指针指向一个地址。

weak_ptr:解决share_ptr的内存泄漏

5.虚函数表,虚函数表指针?

当一个类拥有虚函数时,编译器会为这个类创建一个虚函数表,同时会给类插入一个隐式的指针(一般是对象首地址),指向对应的虚函数表。这个类的每一个对象都具有一个虚表指针。

6.构造函数和析构函数可以是虚函数吗?

构造函数不能是虚函数,因为构造函数调用结束才拥有内存空间,才能进行其他操作

而析构函数可以是虚函数,因为此时已经有了内存且拥有虚表指针,将析构函数设置为虚函数可以解决菱形继承带来的一些问题。

7.static_cast和dynamic_cast的区别?各自的用途?为什么用dynamic_cast的地方不用static_cast?

static_cast:用作编译期的类型强制转换,可以转换基本类型与指针类型,无法去除类型关键字(比如const,ref),下行转换时不安全。

dynamic_cast:运行时的类型转换,拥有安全性检查,当无法转换时会得到一个nullptr

8.STL的vector,list,map,unordered_map。

vector:通过动态分配内存实现动态数组

list:双向链表

map:关联容器,红黑树

unordered_map:哈希表

9.两个栈模拟队列怎么实现?

使用栈1用来推入元素

当需要出队的时候,推出栈2的顶部元素,如果栈2为空,则把栈1元素全部转移到栈2

10.STL里面的sort函数的实现?

sort在较大数据量时使用快速排序,分段递归,当分段后的数据量小于某个阈值时,为避免递归调用带来的负荷,会改用插入排序。如果递归调用层次很深,则会使用堆排序。

 

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值