c++内存分配(堆栈 new malloc)和内存常见错误
2017-04-12 22:06
288 查看
内存分配
1 常量存储区(注意:不能用进行修改!)
2静态存储区(全局 satic)
3 堆
4 栈
堆和栈的区别:
(1 )堆是new delete建立,需要自己释放容易出现内存泄漏,栈由编辑器维护,结束时自动释放。
(2)堆的空间大高达4G,new delete造成内存不连接,存在碎片;栈空间有限,先入后出不产生碎片。
(3)生长方向不同
4 new delete
new 完成了开辟空间和初始后的工作,然后将这段地址返回。
T * a=new T (t); delete a; //初始化为t
T * a=new T
(t);delete[] a;
T (*a)
=new int[M]
;//这样就可以构造二维的“数组”
在运行时能确定N就可以了,可以是变量,表达式,或者函数调用。
注意动态开辟了内存大小为sizeof(T) 和 N *sizeof(T),
当开辟不成功,可能a=NULL或者有的会报错。
当开辟的内存不足时,即存放的数据》开辟的内存时,再用a访问也会越界,运行时出现异常。
0x77...处有未经处理的异常:0xC0000374,堆已损坏
delete free只是内存释放,指针还存在,变成野指针!!!
5 c中malloc free
malloc 则必须要由我们计算字节数,并且在返回后强行转换为实际类型的指针。
int* p;
p = (int *) malloc (sizeof(int)*128);//分配128个(可根据实际需要替换该数值)整型存储单元,并将这128个连续的整型存储单元的首地址存储到指针变量p中
double *pd=(double *) malloc (sizeof(double)*12);//分配12个double型存储单元,并将首地址存储到指针变量pd中
malloc 只管分配内存,并不能对所得的内存进行初始化,所以得到的一片新内存中,其值将是随机的。
6区别:
都是建立在堆上,开辟释放动态内存
区别: 对于非基本数据类型,malloc 不能完成初始化和析构。
malloc/free属于c++/C标准库函数,不受编译器的
new delete 属于运算符
c函数只能使用malloc free处理
7来自高质量的C++/C编程指南第7内存管理
发生内存错误是件非常麻烦的事情。编译器不能自动发现这些错误,通常是在程序
运行时才能捕捉到。而这些错误大多没有明显的症状,时隐时现,增加了改错的难度。
有时用户怒气冲冲地把你找来,程序却没有发生任何问题,你一走,错误又发作了。
常见的内存错误及其对策如下:
1 常量存储区(注意:不能用进行修改!)
2静态存储区(全局 satic)
3 堆
4 栈
堆和栈的区别:
(1 )堆是new delete建立,需要自己释放容易出现内存泄漏,栈由编辑器维护,结束时自动释放。
(2)堆的空间大高达4G,new delete造成内存不连接,存在碎片;栈空间有限,先入后出不产生碎片。
(3)生长方向不同
4 new delete
new 完成了开辟空间和初始后的工作,然后将这段地址返回。
T * a=new T (t); delete a; //初始化为t
T * a=new T
(t);delete[] a;
T (*a)
=new int[M]
;//这样就可以构造二维的“数组”
在运行时能确定N就可以了,可以是变量,表达式,或者函数调用。
注意动态开辟了内存大小为sizeof(T) 和 N *sizeof(T),
当开辟不成功,可能a=NULL或者有的会报错。
当开辟的内存不足时,即存放的数据》开辟的内存时,再用a访问也会越界,运行时出现异常。
0x77...处有未经处理的异常:0xC0000374,堆已损坏
delete free只是内存释放,指针还存在,变成野指针!!!
5 c中malloc free
malloc 则必须要由我们计算字节数,并且在返回后强行转换为实际类型的指针。
int* p;
p = (int *) malloc (sizeof(int)*128);//分配128个(可根据实际需要替换该数值)整型存储单元,并将这128个连续的整型存储单元的首地址存储到指针变量p中
double *pd=(double *) malloc (sizeof(double)*12);//分配12个double型存储单元,并将首地址存储到指针变量pd中
malloc 只管分配内存,并不能对所得的内存进行初始化,所以得到的一片新内存中,其值将是随机的。
6区别:
都是建立在堆上,开辟释放动态内存
区别: 对于非基本数据类型,malloc 不能完成初始化和析构。
malloc/free属于c++/C标准库函数,不受编译器的
new delete 属于运算符
c函数只能使用malloc free处理
7来自高质量的C++/C编程指南第7内存管理
发生内存错误是件非常麻烦的事情。编译器不能自动发现这些错误,通常是在程序
运行时才能捕捉到。而这些错误大多没有明显的症状,时隐时现,增加了改错的难度。
有时用户怒气冲冲地把你找来,程序却没有发生任何问题,你一走,错误又发作了。
常见的内存错误及其对策如下:
相关文章推荐
- C++常见内存错误汇总
- C++常见内存错误及解决方案
- C++常见错误之一 内存错误
- C++内存分配方式及常见错误
- c++常见内存错误
- C++常见内存错误及解决方案
- C++中常见的内存错误
- c++内存管理之三------常见的内存错误及其对策
- c++ 常见的内存错误
- C++内存管理之常见的内存错误
- C++常见的内存错误及其对策
- [转]C++常见内存错误汇总
- c++常见内存错误
- C++常见内存错误与解决方法
- C++常见内存错误汇总
- c语言中较常见的由内存分配引起的错误_内存越界_内存未初始化_内存太小_结构体隐含指针
- c/c++下常见的内存错误及其对策
- 基于C++中常见内存错误的总结
- 基于C++中常见内存错误的总结
- C语言学习7 :二级指针定义,强制转换,多级指针初步,6级指针构造,错误应用*p=&a,错误应用 二级p2,void型指针的兼容性,malloc函数基本用法,malloc分配空间和堆栈空间的区别,验证malloc函数内存的分配,验证malloc函数的越界,内存泄漏,指针不能返回局部变量地址,内存分配