Ask*_*aga 1 c++ constructor vector
如果我要实现一个vector类,我会在内部使用一个动态分配的数组来存储这些项.每当缓冲区变小时,我会创建一个大小为两倍的新缓冲区,复制项目并删除旧缓冲区 - 因此每次推送项目时都不需要重新生成缓冲区.
这种方法在C++中有一些严重的问题:不可能在没有默认构造函数的情况下分配类型的数组(new []).显然std :: vector以某种方式解决了这个限制,因为它允许我使用我想要的任何项类型 - 即使它没有默认构造函数.
我试着看一下源代码,但它似乎只是乌龟一直在下来 - 使用无穷无尽的代码和一些严肃的黑魔法.我真的很感激有人解释这是如何工作的 - 如果可能的话,比源更容易理解.
将内存分配与对象生存期分离的基本机制是:
在代码中,它看起来像
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 new
和operator delete
是默认分配和释放函数,由new
和delete
表达式使用.
对于标准容器,它包含在"allocator"类中,具有执行每个操作的成员函数; 如果您有特殊需求,默认情况下不满足,您可以提供自己的分配器std::allocator
.