new运算是先分配内存再执行构造函数,delete是先执行析构函数再释放内存。
STL allocator将这些操作做了精密分工:内存配置有alloc::allocate()
负责,内存释放由alloc::deallocate()
负责; 对象构造由::construct()
负责,对象析构由::destroy()
负责。
STL采用了两级配置器,当分配的空间大小超过128字节时,会使用第一级空间配置器,直接使用malloc()、realloc()、free()函数进行内存空间的分配和释放;当分配的空间小于128字节时,为减少申请小内存造成的内存碎片和额外负担问题,将使用第二级空间配置器,它采用了内存池技术,通过16个free-list
来配置和回收内存,free-list对内存的需求量按8的倍数处理,也就是16个free-list分别管理8,16,24……128字节的内存区块。
C++所有的标准容器类都接受一个allocator类作为其模板参数;这个参数有一个默认值,比如std::vector1
2
3
4template <class T, class Alloc = alloc> // 预设使用 alloc 为配置器
class vector {
}
1 | std::string s="123"; |
结果报错: cannot pass non-trivial object of type ‘std::string’ (aka ‘basic_string
也有可能不报错但是显示不正常,这跟编译器有关。