c++再学习(内存管理函数的重载)

在实现stl的过程中遇到了很多内存管理方面的问题,这里做个笔记以便复习,也供大家参考。
1.内存管理的手段
malloc()/free():malloc()是c语言中就存在的内存管理函数(库函数),不能够被重载,需要手动传开辟空间的大小,失败返回NULL,错误形式返回错误码,返回值为void*(不了解什么是void*的,可以查看这篇博客),通过强制转型与分配的对应位置一致。
new()/delete():c++中新增的内存操作符(注意它不是一个函数(可以严格把它称为new operator和后面的operator new 区分开来)),new包含两个部分,一是分配内存,二是调用构造函数,delete和new同理。
operator new/delete:实际操作内存的手段,在源码中可以看到是调用了malloc和free实现。不需要手动传入开辟内存的大小,错误形式为抛出异常(其实就是封装过了的malloc/free)注意!!这个部分是可以重载的!
placement new:

new (指针)构造函数(参数1,参数2……);

其实placement new 本身并不分配内存,它只是给一个确定分配好的指针建立对象,所以说其实也不存在对应的placement delete,但是也有习惯性把placement new
对应的delete称为placement delete,无需纠结,意会即可。

allocator:stl中对容器已经封装好的内存管理器,随调随用即可。

就这样我们捋出了一条路线,最基础的内存分配时malloc/free,operator new/delete是对malloc/free的封装加强,
new/delete关键字是对operator new/delete的封装加强,allcator是在stl中适应stl的特殊内存分配方式,placement new是对已经分配好的内存进行操作的方式。由此可见,对于内存的管理贯穿了c/cpp的发展。

你可能感兴趣的:(c++再学习,c++,学生)