如何在不出现对象初始化问题的情况下实现向量的工作?

时间:2014-11-11 10:15:41

标签: c++ vector constructor

如果我要实现一个矢量类,我会在内部使用一个动态分配的数组来存储这些项。每当缓冲区变小时,我会创建一个大小为两倍的新缓冲区,复制项目并删除旧缓冲区 - 因此每次按下项目时都不需要重新生成缓冲区。

这种方法在C ++中存在一些严重问题:无法分配没有默认构造函数的类型的数组(new [])。显然std :: vector以某种方式解决了这个限制,因为它允许我使用我想要的任何项类型 - 即使它没有默认的构造函数。

我试着查看源代码,但它似乎只是乌龟一直在下 - 使用无穷无尽的代码和一些严重的黑魔法。 我真的很感激有人解释这是如何工作的 - 如果可能的话,比源更容易理解。

1 个答案:

答案 0 :(得分:8)

将内存分配与对象生存期分离的基本机制是:

  • 调用分配函数来分配原始内存而不创建对象
  • 使用placement-new在该内存中创建对象
  • 直接调用他们的析构函数来销毁对象而不释放内存
  • 调用释放函数来释放内存。

,在代码中看起来像

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 newoperator delete是默认的分配和解除分配函数,由newdelete表达式使用。

对于标准容器,它包含在一个"分配器" class,用成员函数来完成这些操作中的每一个;如果您有默认std::allocator未满足的特殊需求,您可以提供自己的分配器。