gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 14:45:16 33 4
gpt4 key购买 nike

我有

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/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com