C++ 常见面试知识点

发布于:2025-02-28 ⋅ 阅读:(15) ⋅ 点赞:(0)

主要介绍C++常见面试题

1、说一下你理解的C++中的四种智能指针

常用接口
T* get();
T& operator*();
T* operator->();
T& operator=(const T& val);
T* release(); 将 封装在内部的指针置为nullptr, 但并不会破坏指针所指向的内容, 函
数返回的是内部指针置空之前的值;
void reset (T* ptr = nullptr);直接释放封装的内部指针所指向的内存, 如果指定了 ptr 的值, 则将内部指针初始化为该值 (否则将其设置为nullptr)

weak_ptr(弱引⽤)
解决shared_ptr循环引用导致内存泄漏问题。 2层shared_ptr

2、C++ 中内存分配情况

栈:由编译器管理分配和回收,存放局部变量和函数参数。
堆:由程序员管理,需要⼿动 new malloc delete free 进⾏分配和回收,空间较⼤,但可能会
出现内存泄漏和空闲碎⽚的情况。
全局/静态存储区:分为初始化和未初始化两个相邻区域,存储初始化和未初始化的全局变量
和静态变量。
常量存储区:存储常量,⼀般不允许修改。
代码区:存放程序的⼆进制代码。
在这里插入图片描述

3、C++ 中的指针参数传递和引⽤参数传递

指针传递是值传递
引用是别名,共享内存。传引⽤的实质是传地址,传递的是变量的地址。

4、说⼀下 C++ ⾥是怎么定义常量的?常量存放在内存的哪个位置?

对于局部常量,存放在栈区;
对于全局常量,编译期⼀般不分配内存,放在符号表中以提⾼访问效率;
字⾯值常量,⽐如字符串,放在常量区。

5、⽆参数构造函数什么时候生成

⽆参数构造函数:即默认构造函数,无任何构造函数,编译器会自动生成。

6、 野指针与悬空指针有什么区别?

野指针(wild pointer):就是没有被初始化过的指针。
悬空指针:是指针最初指向的内存已经被释放了的⼀种指针。

7、 函数传递参数的⼏种⽅式

值传递:形参是实参的拷⻉,函数内部对形参的操作并不会影响到外部的实参。
指针传递:也是值传递的⼀种⽅式,形参是指向实参地址的指针,当对形参的指向操作时,就
相当于对实参本身进⾏操作。
引⽤传递:实际上就是把引⽤对象的地址放在了开辟的栈空间中,函数内部对形参的任何操作
可以直接映射到外部的实参上⾯。

8、new / delete ,malloc / free 区别

都可以⽤来在堆上分配和回收空间。new /delete 是操作符,malloc/free 是库函数。
执⾏ new 实际上执⾏两个过程:1.分配未初始化的内存空间(malloc);2.使⽤对象的构造
函数对空间进⾏初始化;返回空间的⾸地址。如果在第⼀步分配空间中出现问题,则抛出
std::bad_alloc 异常,或被某个设定的异常处理函数捕获处理;如果在第⼆步构造对象时出现
异常,则⾃动调⽤ delete 释放内存。
执⾏ delete 实际上也有两个过程:1. 使⽤析构函数对对象进⾏析构;2.回收内存空间
(free)。

new 得到的是经过初始化的空间,⽽ malloc 得到的是未初始化的空间。

9、多态分类,有哪几种

静态多态,编译时多态主要通过函数重载和模板实现。
运行时多态主要通过虚函数和继承实现,其优点是灵活性高,可以在运行时根据实际对象类型来决定调用哪个函数。