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)调用构造函数。
翻译代码形式大体为:
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
原创粉丝点击