开始看STL源码分析,最开始讲到allocator,然后侯捷模拟了两种内存分配方式,感觉挺不错的所以记录下来:
1. 是分配一块新的内存空间 即:利用malloc或者new 来分配新的空间
2. 在旧的空间上替换新的值 即:placement new
例子:
inline T* __allocator(ptrdiff_t size,T*)
{
set_new_handler(0);
T* tmp=(T*)(::operator new(size*sizeof(T)));
if(0==tmp)
{
cerr<<"out of memory"<<endl;
}
return tmp;
}
template<typename T,typename E>
inline void __construct(T* p,E value)
{
new(p) T(value);
}
第一种利用 全局new 函数 实际上就是利用 calloc分配一块新的空间。
第二种利用 placement new 实际上就是赋值,在以p开始的空间上 赋值为value.
当然与之对应的就是释放空间了。
1. 是释放掉内存空间 即:free 或者delete
2. 调用析构函数析构掉对象,但是内存空间没有释放 即~T();
例子:
template<typename T>
inline void __deallocate(T* buffer)
{
delete buffer;
}
template<typename T>
inline void _destroy(T* ptr)
{
ptr->~T();
}