STL源码剖析学习笔记(一)

sgi的STL下载地址:: https://sourceforge.net/projects/stlport/

P45

看到里::operator new所以区分一下new和 operator new;
new运算符为C++ 类对象分配内存时,将在分配内存后调用对象的构造函数,在std作用域内,

operator new()指对new的重载形式,它是一个函数,并不是运算符。对于operator new来说,分为全局重载和类重载,全局重载是void* ::operator new(size_t size),在类中重载形式 void* A::operator new(size_t size)。还要注意的是这里的operator new()完成的操作一般只是分配内存,事实上系统默认的全局::operator new(size_t size)也只是调用malloc分配内存,并且返回一个void*指针。而构造函数的调用(如果需要)是在new运算符中完成的。

函数operator new 通常这样声明:
void * operator new(size_t size);
STL源码剖析P45页 对于operator的用法:

T* tmp=(T*)(::operator new((size_t)(size* sizeof(T))));
//我不太懂….为啥要把sizeof返回值转换成size指针…sizeof返回值就是size_t

STL源码剖析P49

一般来说,c++中内存配置操作和释放操作
class Foo{....};
Foo* pf=new Foo;
delete pf;

为了精细分工,STL 将两个操作分开
内存配置由 alloc::allocator()负责,内存释放由alloc::deallocate()负责
对象构造由::construct()负责,对象析够由::destroy()负责

placement new
placement new是重载operator new的一个标准、全局的版本,它不能被自定义的版本代替(不像普通的operator new和operator delete能够被替换成用户自定义的版本.

如果你想在已经分配的内存中创建一个对象,使用new是不行的。也就是说placement new允许你在一个已经分配好的内存中(栈或堆中)构造一个新的对象。原型中void*p实际上就是指向一个已经分配好的内存缓冲区的的首地址。
使用方法:

缓冲区提前分配
可以使用堆的空间,也可以使用栈的空间,所以分配方式有如下两种:

class MyClass {…};
char *buf=new char[N*sizeof(MyClass)+ sizeof(int) ] ; 或者char buf[N*sizeof(MyClass)+ sizeof(int) ];

对象的构造
MyClass * pClass=new(buf) MyClass;
对象的销毁
一旦这个对象使用完毕,你必须显式的调用类的析构函数进行销毁对象。但此时内存空间不会被释放,以便其他的对象的构造。
pClass->~MyClass();
内存的释放
如果缓冲区在堆中,那么调用delete[] buf;进行内存的释放;如果在栈中,那么在其作用域内有效,跳出作用域,内存自动释放。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值