C++内存管理笔记--基本用法

1,C++应用程序,使用memory的途径:

2:标准库分配器;3:基本工具;5:操作系统API,图上例子为win下。
C++应用程序中申请内存基于分配器的实现(std::allocator),而分配器基于C++primitives(new,new[]...),c++primitives基于C语言中的malloc/free..,当然越底层的函数效率越高.
那我们会想,直接用最底层的实现多好,效率还高.但如果你直接调用底层的函数去实现功能,虽然你的效率提高了,但你的程序的可移植性就会相应的降低.

相关api如下:

2,介绍C++三种申请内存的工具和使用方法。
A.new operator, delete operator : 申请内存+构造函数
B.new[], delete[] : 用于数组类的操作
C.placement new : 定点new

2.1 new operator, delete operator
int main()
{
void* pMalloc = malloc(512); //512bytes
free(pMalloc );

complex<int>* pNew = new complex<int>; //one object
delete pNew ;

void* pOperator = ::operator new(512);// 512bytes
::operator delete(pOperator );

//一下函数都是non-static,一定要通过object调用,分配7个int的内存
void* pAllocator = allocator<int>().allocate(7);//allocator<int>()创建临时对象,生存周期只在这行。
allocator<int>().deallocate((int*)p4,7);

return 0;
}

2.2 new expression
当我们使用关键字new在堆上动态创建一个对象时,它实际上做了三件事:获得一块内存空间、调用构造函数、返回正确的指针。比如:
A* pA = new A( 3 );
编译器在我们背后做了以下动作:
A *pA;
try{
void *mem = operator new( sizeof(A) ); //分配内存
pA = static_cast<A*>(mem); //类型转换
pA->A::A(3); //只有编译器中才可以直接调用构造函数。直接调用构造函数方法:使用placement new :new(pA)A(3);
}
catch (std::bad_alloc)
{
//allocation失败,不执行构造函数。
}

再看看void *mem = operator new( sizeof(A) ); //分配内存的操作。


2.3 delete expression
A* pA = new A( 3 );
delete pA;

编译器转为:
pA->~A(); //执行析构函数
operator delete(pA); //释放内存 在operator delete(void *p)中使用free.

2.4 placement new,也叫定点new


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值