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

Ask*_*aga 1 c++ constructor vector

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

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

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

Mik*_*our 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
Run Code Online (Sandbox Code Playgroud)

where operator newoperator delete是默认分配和释放函数,由newdelete表达式使用.

对于标准容器,它包含在"allocator"类中,具有执行每个操作的成员函数; 如果您有特殊需求,默认情况下不满足,您可以提供自己的分配器std::allocator.