释放动态数组的最后一个元素

Sla*_*zer 0 c++ arrays dynamic delete-operator

我有

int * array=new int[2];
Run Code Online (Sandbox Code Playgroud)

我想释放最后一个元素的内存,从而将分配的内存减少到只有 1 个元素。我试着打电话

delete array+1;
Run Code Online (Sandbox Code Playgroud)

但它给出了错误

*** 检测到 glibc *** skuska: free(): 无效指针: 0x000000000065a020 *

这可以在没有显式重新分配的情况下在 C++03 中完成吗?

注意:如果我想使用类而不是原始数据类型(如 int),我该如何释放内存以便也调用类的析构函数?

注2:我正在尝试实施 vector::pop_back

Ben*_*ley 5

不要new[]为此使用表达式。这不是矢量的工作方式。你要做的是分配一块原始内存。您可以为此使用 malloc ,或者您可以使用operator new,这与 new 表达式不同。假设您使用了默认分配器,这基本上就是reserve()成员函数std::vector所做的。它不像new[]表达式那样创建任何实际对象。

当你想构造一个元素时,你可以使用placement new,将你分配的原始内存中的某个位置传递给它。当你想要销毁一个元素时,你可以直接调用它的析构函数。完成后,不要使用delete[]表达式,而是使用operator deleteif 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);
}
Run Code Online (Sandbox Code Playgroud)

pop_back 将通过简单地调用最后一个元素的析构函数并将 size 成员变量减 1 来实现。它不会,不应该(并且不能,不制作一堆不必要的副本)释放任何内存。