c++内存管理1

本文介绍了C++中的内存管理机制,包括内存分配与释放的过程,并详细分析了new与delete操作符的工作原理及其与底层函数的调用关系。

     在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);//分配512bytes
free(p1);//释放分配的512bytes

complex<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个int
allocator<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;
}

上面运行结果如下:


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值