gpt4 book ai didi

c++ - C++:如何安全地取消分配 vector 的堆分配数组?

转载 作者:行者123 更新时间:2023-12-02 09:59:13 25 4
gpt4 key购买 nike

我目前正在使用代码,目前需要我创建一个 vector 数组(我是C++的新手,如果这是一个绝对可怕的想法,我将非常感谢您的反馈)。
假设我在堆上为 vector 分配内存,如下所示:

#include <iostream>
#include <vector>
#include <random>

int main() {
typedef std::vector<double> doubleVec;
long N = 1000;
long M = 1000;

doubleVec *array = new doubleVec[N];

for (long i = 0; i < N; i++) {
doubleVec currentVec = array[i];
currentVec.resize(M);
for (long j = 0; j < M; j++)
currentVec[j] = std::rand();
}
// ... do something with the data structure

delete [] array;
}
当我完成所有需要处理的数据后,应该如何安全地释放该数据结构?
注意:在我的初始帖子中我做错了其他事情,这些内容我不想成为讨论的重点(未初始化的变量,未调整 vector 的大小等)。我现在修复了。谢谢大家指出来。

最佳答案

f this is an absolutely terrible idea, I would greatly appreciate the feedback).


是的,这是一个非常糟糕的主意。具体来说,拥有裸露的指针是一个坏主意。与其手动分配动态数组,不如使用 std::vector之类的容器通常更好。

How to safely deallocate a heap-allocated array of vectors?


通过使用 vector 代替手动动态数组。在这种情况下,一种简单的解决方案是使用 vector 的 vector 。
可能更好的解决方案是分配单个平面 vector ,其大小为1000 * 1000的两倍,其中每个“子 vector ”的元素都一个接一个。这需要一些简单的数学运算来计算子 vector 的索引,但是在大多数情况下速度更快。

其他说明:
typedef std::vector<double> doubleVec;

通过隐藏这样的类型名称,避免混淆程序。
 for (long j; j < M; j++)
^^^^^^

您保留此变量未初始化。以后使用不确定值时,程序的行为是不确定的。
此外,您忘记了包含定义 std::vectorstd::rand的标准 header 。

I got a seg fault


关于您没有将任何元素实际添加到数组中 vector 的其他答案,请参见其他答案。这和未初始化的变量是段错误的最可能原因,具体取决于“执行某项操作”的内容。

关于c++ - C++:如何安全地取消分配 vector 的堆分配数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63571618/

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