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

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

相关api如下:
C++内存管理笔记--基本用法_第2张图片
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* pNew = new complex; //one object
delete pNew ;

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

//一下函数都是non-static,一定要通过object调用,分配7个int的内存
void* pAllocator = allocator().allocate(7);//allocator()创建临时对象,生存周期只在这行。
allocator().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(mem); //类型转换
pA->A::A(3); //只有编译器中才可以直接调用构造函数。直接调用构造函数方法:使用placement new :new(pA)A(3);
}
catch (std::bad_alloc)
{
//allocation失败,不执行构造函数。
}

再看看void *mem = operator new( sizeof(A) ); //分配内存的操作。
C++内存管理笔记--基本用法_第3张图片


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
C++内存管理笔记--基本用法_第4张图片

你可能感兴趣的:(C++,内存管理,读书笔记)