C++内存管理

C++内存管理解析
  1. 获取内存——创建对象——销毁对象——释放内存

  2. 中间出错C++本身是否提供了处理机制,还是需要用户显示处理?

参考:

如何实现一个malloc:http://blog.jobbole.com/75656/  细说new与malloc的十个不同:http://www.linuxidc.com/Linux/2016-01/127591.htm

malloc在c libarariy中的原型:http://www.cplusplus.com/reference/cstdlib/malloc/

内存管理学习纲要:http://www.cnblogs.com/Azhu/p/4436531.html

 c++内存布局(memory layout)

Q:全局变量与局部变量是否在同一块内存区域?不同的内置类型是否在同一块内存?内置类型与类类型的内存布局?动态内存的物理位置?

 1 int i;
 2 int  foo(int arg)
 3 {
 4     int sum = (arg + 1)*arg / 2;
 5     return sum;
 6 }
 7 int mian()
 8 {
 9     int j = 0;
10     static int k = 1;
11     int *m = &j;
12     int *n = new int();
13     foo(k);
14     char a = 'a';
15     char *p = "dhah";
16     string s = "s";
17     
18 }

这段代码里使用的变量的物理内存各是怎样的?

在C++中,内存分成5个区,他们分别是堆、栈、自由存储区、全局/静态存储区和常量存储区。
:在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束时这些存储单元自动被释放。栈内存分配运算效率很高,但是分配的内存容量有限。
:就是那些由 new分配的内存块,释放需要用户手动管理
自由存储区:就是那些由malloc等分配的内存块,他和堆是十分相似的,不过它是用free来结束自己的生命的。
全局/静态存储区:全局变量和静态变量被分配到同一块内存中,在以前的C语言中,全局变量又分为初始化的和未初始化的,在C++里面没有这个区分了,他们共同占用同一块内存区。
常量存储区:这是一块比较特殊的存储区,他们里面存放的是常量,不允许修改。如char *p="whja",右边字符串是不能修改的,类型为const 指针按照规则是不能转换为非const指针的,此处右边类型 为         const char *,编译器允许转换到右边,但还是不能修改右边字符串

c动态内存管理

void *malloc(size_t size),向系统申请size bytes(字节)大小的内存,成功返回一个void*指针(因为申请的内存区域是无类型的, 未初始化),指向首地址,失败返回一个null pointer,size=0返回值依赖于库实现。使用申请的内存构造对象需要把void*指针cast为对应指针,如 char*p = (char *)malloc(100))(100个bytes) ,这种100个字节创建多少个char呢?可用char *p=(char*) malloc(100*sizeof(char))申请100个char内存。Tips:malloc申请的内存未初始化,值是UB的,如cout<<p[0]<<endl;p[0]=2,初始化后再输出。申请了内存未初始化就使用它

void* free(void*)释放内存

Q:Void*指针和其他指针的转换关系?

Q:用malloc为string分配内存?

为什么有了malloc/free只有还要有new/delete

参考:http://www.cnblogs.com/Azhu/p/4436531.html

malloc是库函数,属于c标准库,不能管理类类型的对象内存分配。new是c++运算符,string *s= new string,先调用operator new()获取未初始化的内存空间,再调用string类的相应构造函数创建对象,delete时也是先执行string的析构函数销毁对象,再调用operator delete()释放内存空间。很明显malloc不能实现这些隐藏的过程。

 

C++动态内存管理:从new/delete到类模板allocator与智能指针

int *p = new int,执行默认初始化,如果不是全局变量,p指向的值未定义;int *s=new string,由string内的默认构造函数创建一个空字符串,这与内置类型不同,如果类类型含有内置类型或复合类型的成员,不提供初始值,也会导致未定义;在类型名后加()可以执行值初始化,如int *p=new int(),初始化值为0(摘自c++ primer 5th 12.1.2节)

new/delete易引发的错误:1、new一块内存后,忘记delete它;2、两个指针引用同一块内存,delete两次;3、使用已经释放掉的对象(参见c++primer 5th 12.1.2节)

new表达式把内存的获取与对象的初始化组合在一起,delete表达式把对象的销毁与释放内存组合在一起。alllocator可以灵活的分开内存获取与对象创建,

 

转载于:https://www.cnblogs.com/hchacha/p/7136619.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值