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

标签 c++ arrays dynamic delete-operator

我有

int * array=new int[2];

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

delete array+1;

但是报错

*** glibc detected *** skuska: free(): invalid pointer: 0x000000000065a020 *

这可以在 C++03 中完成而无需显式重新分配吗?

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

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

最佳答案

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

当你想构造一个元素时,你使用placement new ,将它传递给您分配的原始内存中的某个位置。当你想销毁一个元素时,你直接调用它的析构函数。完成后,不使用 delete[] 表达式,而是使用 operator delete 如果您使用 operator new,或者您使用 free() 如果你使用了 malloc

这是一个创建 10 个对象并以相反顺序销毁它们的示例。我可以按任何顺序销毁它们,但这是您在 vector 实现中的做法。

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 来实现。它不会,不应该(也不能,不做一堆不必要的拷贝)释放所有内存。

关于c++ - 释放动态数组的最后一个元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13215645/

相关文章:

c++ - C++中的动态二维数组和内存泄漏

c++ - 包含 header 会导致解析问题

c++ - 如何将新字符串重写到文本文件中的特定位置

php - 在 PHP 中将数组元素添加到子数组

arrays - 基于 NSData 子集的 Swift NSData 字符串转换

c - 在 C 递归函数中作为引用传递的数组的动态内存分配

c++ - 当操作的变量是 const 时,如何修复括号/索引运算符重载?

c++ - 库函数的新实现并在其中调用旧实现

php连接多个json文件并按id分组

java - 加载类,生成该类的对象