内存管理相关

本文总结了关于c/c++常见的关于内存以及内存管理方面的面试题,并尽量以自己的语言整理答案、分析原理。

1.c语言中struct和union的区别

(1) 结构体与联合体虽然都是由多个不同的数据类型成员组成的,但不同之处在于联合体中所有成员共用一块内存空间,即联合体只存放了一个被选中的成员,而结构体中所有成员占用空间是独立的,其所有成员都存在,不同成员会存放在不同的地址。所以结构体在计算一个结构型变量的总长度时,其内存空间大小等于所有成员长度之和(需要考虑字节对齐),而在联合体中,所有成员不能同时存在,所以一个联合型变量的大小等于其占用空间最大的成员的大小。

(2) 对于联合体的不同成员赋值,将会对它的其他成员重写,原来成员的值就不存在了, 而对结构体的不同成员赋值是互不影响的。

2.malloc/free和new/delete区别

可以参考以下这篇博客,总结地很详细了
https://blog.csdn.net/weibo1230123/article/details/81980889

我自己总结其中几个重点区别:
(1)new/delete 是c++重载的运算符,其底层仍要调用malloc/free
(2)malloc开辟内存空间大小需要自己手动计算,new由编译器自己计算
(3)malloc/free为函数只是开辟空间并释放,new/delete则不仅会开辟空间,并调用构造函数和析构函数进行初始化和清理

3.如何检查内存泄漏?如何解决?

内存泄漏是指在动态分配内存时,使用后没有手动释放内存,导致可用内存越来越少

关于内存泄漏的检测,详见下面博客
https://blog.csdn.net/qq_41786318/article/details/81838359

https://blog.csdn.net/sduliulun/article/details/7732906

对于如何避免内存泄漏,一方面要养成良好编程习惯,保证malloc/free,new/delete成对出现,
另一方面可使用c++11标准下的智能指针。关于智能指针及其他c++11内容详解见我另一篇博客
https://blog.csdn.net/sunximei/article/details/119643668

4.vector扩容机制

vector扩容机制很好理解,空间2倍增长:当前内存空间用完时,申请当前空间二倍的容量,再将原vector元素拷贝至新的内存空间。

扩展问题:如何拷贝?是memcpy还是循环拷贝?
答:对于POD对象,使用memecpy;对于非POD对象,使用循环拷贝。
原因如下:
void memcpy(voiddest, const void *src, size_t n);
功能:从源src所指的内存地址的起始位置开始,拷贝n个字节的数据到目标dest所指的内存地址的起始位置中。

对于POD(plain old data structure)类型的对象,c++中一般指传统c风格的类型;这种类型没有自定义构造、析构函数,没有继承关系,成员不含有其他非POD类型对象的指针。

可以看到memcpy底层是按位的无差别拷贝,对于c++来说,假如非pod对象中含有其他非pod对象指针,memcpy相当于浅拷贝,只是拷贝了指针,析构时会造成重复释放,故对于非POD对象,使用循环拷贝(该类应该正确定义了拷贝构造函数)

5.关于智能指针

见另一篇博客

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值