不要new[]
为此使用表达式。这不是矢量的工作方式。你所做的是分配一块原始内存。您可以为此使用 malloc ,也可以使用operator new,这与 new 表达式不同。假设您使用了默认分配器,这基本上就是reserve()
成员函数的作用。std::vector
它不会像new[]
表达式那样创建任何实际对象。
当你想构造一个元素时,你可以使用placement new,将它传递给你分配的原始内存中的某个位置。当你想破坏一个元素时,你直接调用它的析构函数。完成后,不要使用delete[]
表达式,而是使用operator delete
if you used operator new
,或者使用free()
if you used malloc
。
这是一个创建 10 个对象并以相反顺序销毁它们的示例。我可以按任何顺序销毁它们,但这是你在向量实现中的做法。
int main()
{
void * storage = malloc(sizeof(MyClass) * 10);
for (int i=0; i<10; ++i)
{
// this is placement new
new ((MyClass*)storage + i) MyClass;
}
for (int i=9; i>=0; --i)
{
// calling the destructor directly
((MyClass*)storage + i)->~MyClass();
}
free(storage);
}
pop_back
将通过简单地调用最后一个元素的析构函数并将 size 成员变量减 1 来实现。它不会、不应该(并且不能,如果不制作一堆不必要的副本)释放任何内存。