二、面经整理(二)

三、阿里优酷 C++开发实习面经

1.自我介绍

2.c内存分配有哪几种方式

静态内存分配:在程序编译时就已经分配好了一块固定大小的内存空间,程序运行时一直存在。例如:全局变量和静态变量。

栈式内存分配:在函数调用时,在栈上分配一块固定大小的内存空间,函数执行完毕后,内存自动释放。例如:局部变量。

堆式内存分配:程序在运行时动态地分配内存空间,可以根据需要分配和释放内存,由程序员控制。例如:动态分配内存的函数malloc()和free()

3.虚函数和虚函数表如何对应关系

4.C++四种智能指针

C++中的智能指针有4种,分别为:shared_ptr、unique_ptr、weak_ptr、auto_ptr,其中auto_ptr被C++11弃用。

  1. auto_ptr(C++98的方案,C++11已经弃用)
    采用所有权模式
  2. unique_ptr(替换auto_ptr)
    unique_ptr实现独占式拥有或严格拥有概念,保证同一时间内只有一个智能指针可以指向该对象。它对于避免资源泄露,例如,以new创建对象后因为发生异常而忘记调用delete时的情形特别有用。
  3. shared_ptr(非常好使)
    shared_ptr实现共享式拥有概念。多个智能指针可以指向相同对象,该对象和其相关资源会在“最后一个引用被销毁”时候释放。从名字share就可以看出了资源可以被多个指针共享,它使用计数机制来表明资源被几个指针共享。可以通过成员函数use_count()来查看资源的所有者个数。除了可以通过new来构造,还可以通过传入auto_ptr, unique_ptr,weak_ptr来构造。当我们调用release()时,当前指针会释放资源所有权,计数减一。当计数等于0时,资源会被释放。shared_ptr 是为了解决 auto_ptr 在对象所有权上的局限性(auto_ptr 是独占的), 在使用引用计数的机制上提供了可以共享所有权的智能指针。
  4. weak_ptr
    weak_ptr 是一种不控制对象生命周期的智能指针, 它指向一个 shared_ptr 管理的对象。进行该对象的内存管理的是那个强引用的 shared_ptr。weak_ptr只是提供了对管理对象的一个访问手段。weak_ptr 设计的目的是为配合 shared_ptr 而引入的一种智能指针来协助 shared_ptr 工作,它只可以从一个 shared_ptr 或另一个 weak_ptr 对象构造, 它的构造和析构不会引起引用记数的增加或减少。weak_ptr是用来解决shared_ptr相互引用时的死锁问题,如果说两个shared_ptr相互引

5.死锁

  1. 死锁: 是指多个进程在执行过程中,因争夺资源而造成了互相等待。此时系统产生了死锁。比如两
    只羊过独木桥,若两只羊互不相让,争着过桥,就产生死锁。
  2. 产生的条件:死锁发生有四个必要条件:
    (1)互斥条件:进程对所分配到的资源不允许其他进程访问,若其他进程访问,只能等待,直到
    进程使用完成后释放该资源;
    (2)请求保持条件:进程获得一定资源后,又对其他资源发出请求,但该资源被其他进程占有,
    此时请求阻塞,而且该进程不会释放自己已经占有的资源;
    (3)不可剥夺条件:进程已获得的资源,只能自己释放,不可剥夺;
    (4)环路等待条件:若干进程之间形成一种头尾相接的循环等待资源关系。
  3. 如何解决:
    (1)资源一次性分配,从而解决请求保持的问题
    (2)可剥夺资源:当进程新的资源未得到满足时,释放已有的资源;
    (3)资源有序分配:资源按序号递增,进程请求按递增请求,释放则相反。

6.线程安全的集合有哪些

Hashtable与Vector类似,互斥锁!

7.抽象工厂模式和工厂方法模式的区别

8.构造函数为什么不能被继承

为什么构造函数不能继承?
构造函数不能继承的原因是因为继承是用于继承类的属性和方法的,而构造函数是用于初始化对象的。
当一个类继承另一个类时,它会继承父类的属性和方法,但是它不会继承父类的构造函数。这是因为构造函数是用于初始化对象的,它需要根据子类的特定需求进行定制。
如果子类没有定义构造函数,那么它会默认调用父类的构造函数。但是,如果子类定义了构造函数,那么它必须显式地调用父类的构造函数,以确保父类的属性和方法能够被正确地初始化。
因此,构造函数不能被继承,而是需要在子类中显式地调用父类的构造函数。

9.手撕代码

你可能感兴趣的:(view,开发语言,c++)