-
获取内存——创建对象——销毁对象——释放内存
-
中间出错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可以灵活的分开内存获取与对象创建,