会吃番茄耶
26-07-06 21:55 微博认证:超话粉丝大咖(赵梦超话)

## 【嵌入式每日一题】DJ面经:

## C++中 new 和 malloc 的区别?

malloc是库函数,只申请内存,需要手动sizeof,不会调用构造函数,返回的是void*无类型指针,需要强制转换。

new是运算符,会调用构造函数初始化,自动按类型分配大小,返回的是对象类型的指针,适用于类中创建对象的时候

## 深拷贝和浅拷贝,什么时候会出问题?

浅拷贝是按成员逐个复制,如果成员是普通变量,比如 `int`、`double`,直接复制值没有问题;但如果成员是指针,浅拷贝只会复制指针地址,不会复制指针指向的堆内存。这样两个对象会指向同一块资源。

深拷贝是在拷贝对象时,如果对象内部有动态内存或资源,会重新申请一份新的资源,并把原对象中的内容复制过去,使两个对象各自拥有独立资源。

浅拷贝在类中包含裸指针、动态内存、文件描述符、socket、DMA-BUF fd、mmap buffer 等资源时容易出问题。比如两个对象指向同一块堆内存,析构时都会 `delete`,就会 double free;一个对象释放资源后,另一个对象还继续访问,就会出现悬空指针或 use-after-free。

因此,如果类管理资源,需要考虑三法则:析构函数、拷贝构造函数、拷贝赋值运算符。要么实现深拷贝,要么禁止拷贝,要么使用 `vector`、`string`、`unique_ptr`、`shared_ptr` 等 RAII 工具管理资源。

发布于 江苏