如果我要实现一个矢量类,我会在内部使用一个动态分配的数组来存储这些项。每当缓冲区变小时,我会创建一个大小为两倍的新缓冲区,复制项目并删除旧缓冲区 - 因此每次按下项目时都不需要重新生成缓冲区。
这种方法在C ++中存在一些严重问题:无法分配没有默认构造函数的类型的数组(new [])。显然std :: vector以某种方式解决了这个限制,因为它允许我使用我想要的任何项类型 - 即使它没有默认的构造函数。
我试着查看源代码,但它似乎只是乌龟一直在下 - 使用无穷无尽的代码和一些严重的黑魔法。 我真的很感激有人解释这是如何工作的 - 如果可能的话,比源更容易理解。
答案 0 :(得分:8)
将内存分配与对象生存期分离的基本机制是:
,在代码中看起来像
void * memory = operator new(capacity() * sizeof(T)); // allocate memory
T * object = new(memory) T; // create an object
T->~T(); // destroy it
operator delete(memory); // deallocate memory
其中operator new
和operator delete
是默认的分配和解除分配函数,由new
和delete
表达式使用。
对于标准容器,它包含在一个"分配器" class,用成员函数来完成这些操作中的每一个;如果您有默认std::allocator
未满足的特殊需求,您可以提供自己的分配器。