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