gpt4 book ai didi

c++ - 是否需要将 delete 用于在 vector 中创建的新数组?

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:21:55 25 4
gpt4 key购买 nike

我正在尝试为 void** 数据数组创建一些动态数组。

std::vector<void*> data;
data.push_back(new double[1024]); // array of doubles
data.push_back(new short[1024]); // array of shorts

为了清理我应该只使用

data.clear();

或者是否需要删除每个新的(s),如果需要,如何完成?

最佳答案

For clean up should I just use

data.clear();

这将从 vector 中删除所有指针。如果其中任何一个是指向它们各自动态对象的唯一拷贝,那么这些对象就不能再被销毁,也不能释放它们的内存。这称为内存泄漏。

Or do each of the new(s) need to be deleted

是的。每次执行 new[] 表达式时,必须恰好有一个 delete[]。如果没有 delete[],则存在泄漏。

and if so, how is that done?

您只需删除每个指针。您必须格外小心,不要在未先删除该 vector 的情况下意外覆盖或删除该 vector 的元素。您还必须注意不要多次删除相同的元素(或其拷贝)。

此外,无法删除指向 void 的指针。指向 void 的指针可以转换为任何数据指针类型,但您必须知道每个元素的类型。一个工作示例

delete[] static_cast<double*>(data[0]);
delete[] static_cast<short* >(data[1]);

存储拥有内存的裸指针通常是一个非常糟糕的主意 - 为此目的使用指向 void 的指针更是如此。更好的设计是将动态数组存储在 RAII 容器中,例如 std::vector:

std::vector<double> doubles(1024);
std::vector<short> shorts (1024);
std::vector<void*> data{doubles.data(), shorts.data()};

这样数组由 vector 拥有,内存由 std::vector 的代码管理。您必须注意 doublesshorts 不能被销毁,只要 data 的元素仍然指向它们。

关于c++ - 是否需要将 delete 用于在 vector 中创建的新数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48254037/

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