C++知识点之内存管理

1:C++的内存分区
C++内存分为堆区,栈区,常量存储区,自由存储区和全局/静态存储区。
栈,就是那些由编译器在需要的时候分配,在不需要的时候自动清除的变量的存储区。里面的变量通常是局部变量、函数参数等。
堆,就是那些由new分配的内存块,他们的释放编译器不去管,由我们的应用程序去控制,一般一个new就要对应一个delete。如果程序员没有释放掉,那么在程序结束后,操作系统会自动回收。
自由存储区,就是那些由malloc等分配的内存块,他和堆是十分相似的,不过它是用free来结束自己的生命的。
全局/静态存储区,全局变量和静态变量被分配到同一块内存中,在以前的C语言中,全局变量又分为初始化的和未初始化的,在C++里面没有这个区分了,他们共同占用同一块内存区。
常量存储区,这是一块比较特殊的存储区,他们里面存放的是常量,不允许修改(当然,你要通过非正当手段也可以修改,而且方法很多)
2:new 和malloc的区别
https://www.cnblogs.com/qg-whz/p/5140930.html
3:new 和delete相关
new 的过程分为两部分,1:通过适当的new运算符函数实例,配置所需内存:int pi = __new(sizeof(int)); 2;将配置得来的对象设置初值:pi = 5.delete 操作会调用重载的delete运算符,内部通过free((char*)ptr);实现。在数组中
int *p_array = new int[5];
vec_new()不会真正被调用,因为它的主要功能是把default constructor施行于class objects所组成的数组的每一个元素身上,倒是operator new会被调用:

int p_array = (int)__new(5 * sizeof(int));
相同的情况:
//struct simple_aggr{float f1,f2;};
simple_aggr p_aggr = new simple_aggr[5];
vec_new()也不会被调用。因为simple_aggr并没有定义一个constructor或destructor,所以配置数组以及清除p_aggr数组的操作,只是单纯地获得内存和释放内存而已。由operator new和operator delete来完成绰绰有余
如果class定义了一个default constructor,某些版本的vec_new()就会被调用
当 delete 一个指向数组的指针时,C++2.0版之前,需要提供数组的大小。而2.1版后,不需要提供数组大小,只有在 [] 出现时,编译器才寻找数组的维度。否则它便假设只有单独一个object要被删除:
//正确的代码应该是delete [] p_array;
delete p_array;
4:new带括号和不带的区别?
无自定义构造函数时,不带括号的new只分配内存,带括号的new会初始化为0
5:new 的时候内存不足?
operator new抛出异常以反映一个未获满足的内存需求之前,会先调用一个客户指定的错误处理函数,new-handler,可以通过调用std::set_new_handler()来设置,std::set_new_handler()定义在<new>中:
namespace std{
typedef void (
new_handler)();
new_handler set_new_handler(new_handler p) throw();
//以上,throw()是一个异常声明,括号内无任何内容,表示不抛任何异常
}
6:delete与析构函数
在delete 的过程中,首先会调用对象自身的析构函数(如果有),然后调用free来释放内存。
7:struct 内存对齐方式
1: 结构体的大小等于结构体内最大成员大小的整数倍。
2: 结构体内的成员的首地址相对于结构体首地址的偏移量是其类型大小的整数倍。
3:(比如说double型成员相对于结构体的首地址的地址偏移量应该是8的倍数)。
4:为了满足规则1和2编译器会在结构体成员之后进行字节填充。
5:64位系统遵循8字节对齐,32位遵循4字节对齐。
如何取消内存对齐?添加预处理指令 #pragma pack(1)。
7:智能指针
智能指针负责自动释放所指对象,可以更容易及安全的使用动态内存。C++中一共有3种智能指针,分别是shared_prt,unique_ptr和weak_ptr。shared_prt是共享指针,它允许多个指针指向一个对象,在拷贝的时候,拷贝时,等号左边的shared_ptr所指的对象引用计数减1,右边shared_ptr所指对象引用计数加1;当一个指针的计数减为0的时候会调用delete去销毁所指向的对象。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容