c++内存管理1
来源:互联网 发布:mac 压感 编辑:程序博客网 时间:2024/04/30 02:58
在c++的开发中,内存管理是个"大坑",一不小心就造成了内存泄漏,这个"坑"也是c++的优势,为什么这么说呢?程序员可以自己调度管理内存,非常灵活,高效的使用内存。Java中的内存管理是由java虚拟机控制管理的,自动进行内存的释放回收。而c++中,在堆上分配的内存是由我们自己回收的,系统不会自动回收,所以在编程的过程中特别小心内存泄漏。c++内存分配与释放综合起来如下图所示:
第一层是应用层,就是我们开发的产品应用;
第二层是c++库函数这层,STL中的各种容器内存分配是通过分配器allocator实现的;
第三层是new操作符,operator new函数等等
第四层是标准c中的malloc和free函数
第五层是操作系统提供的内存分配API借口
图中的箭头表示调用关系。c++ Application可以调用c++ Library中的std::allocator,也可调用new,new[],还可以直接调用malloc,free等
下面对基础分配函数操作的总结实例:void* p1 = malloc(512);//分配512bytesfree(p1);//释放分配的512bytescomplex<int>* p2 = new complex<int>;//分配一个复数对象delete p2;void* p3 = ::operator new(512);//分配512bytes::operator delete(p3);//在vc下int* p4 = allocator<int>().allocate(3,(int*)0); //分配3个intallocator<int>().deallocate(p4,3);
new一个对象做了哪些事?比如 complex* pc = new complex(1,2). 编译器做了2件事:
(1)先分配一块内存,
(2)调用构造函数。
翻译代码形式大体为:
(1)先分配一块内存,
(2)调用构造函数。
翻译代码形式大体为:
void* mem = operator new(sizeof(complex)); //operator new函数内调用的是malloc函数
pc = static_cast<complex*>(mem);
pc->complex::complex(1,2);
所以可以看到调用次序: new---->operator new------>malloc
delete pc会先调用对象的析构函数pc-。~complex();然后执行operator delete(pc)释放内存,operator delete()函数里面是调用free函数实现的。所以其调用次序为:delete----->operator new------->free
下面通过一个实例测试上面的分析
#include<iostream>using namespace std;class A{public:int id;public:A() :id(0){ }A(int v) :id(v){}~A(){ cout << "被析构了" << endl; }};int main(){A* pA = new A(1);cout << pA->id << endl;pA->A::A(3);cout << pA->id << endl;pA->A::~A();cin.get();return 0;}
new[]分配过程分析
complex *pc = new complex[3]; //调用complex构造函数3次
delete[] pc; //调用complex析构函数3次
class B{public:int id;B() :id(0){cout << "缺省构造函数this=" << this << " id=" << id << endl;}B(int v) :id(v){cout << "有参构造函数this=" << this << " id=" << id << endl;}~B(){cout << "析构函数this=" << this << " id=" << id << endl;}};int main(){B* buf = new B[3];B* tmp = buf;cout << "buf=" << buf << " tmp=" << tmp << endl;for (int i = 0; i < 3; i++){new(tmp++)A(i);}cout << "buf=" << buf << " tmp=" << tmp << endl;delete[] buf;cin.get();return 0;}
上面运行结果如下:
1 0
- objective-c 内存管理1
- C/C++动态内存管理(1)
- object c内存管理(1)
- C/C++内存管理(1)
- c/c++内存管理(1)
- [objective-C] 08.内存管理1
- C/C++ 内存管理
- C内存管理函数
- C内存管理
- C内存管理
- object c 内存管理
- C 内存管理详解
- C 内存管理
- C语言内存管理
- c/c++内存管理
- c 的内存管理
- C内存管理
- Ojbective-c 内存管理
- 114.You plan to implement the distributed database system in your company. You invoke Database Confi
- [矩阵]螺旋矩阵问题(上)
- java学习之路 之 面向对象编程-可变个参数-练习题
- Hibernate中不用基本类型
- 【POJ】[1061]青蛙的约会
- c++内存管理1
- Java多线程基础总结
- Ecplise 背景颜色修改
- 获取jdbctemplate的一种方法
- 数据库语句执行顺序
- poj 1185 炮兵阵地(状压dp)
- Makefile字符串、文本处理函数
- UVA 10779 Collectors Problem(最大流)
- 读《Node.js 权威指南》