如何解决C ++:如何安全地取消分配向量的堆分配数组?
我目前正在使用的代码目前需要我创建一个向量数组(我是C ++的新手,如果这是一个绝对可怕的想法,我将非常感谢您的反馈)。
假设我在堆上为矢量分配内存,如下所示:
#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;
}
当我完成所有需要处理的数据后,应该如何安全地释放该数据结构?
注意: 在我的初始帖子中,我做错了其他一些事情,但我不想成为讨论的重点(未初始化的变量,没有调整向量大小等)。我现在修复了。谢谢大家指出来。
解决方法
问题不在取消分配中,而是在每个向量分配中。您在代码中的何处使用M
值(访问元素时除外)?您的代码中还有其他问题,因此快速解决方法是:
for (long i; i < N; i++) {
doubleVec ¤tVec = array[i];
currentVec.resize(M);
for (long j; j < M; j++)
currentVec[j] = std::rand();
}
要特别注意currentVec
是参考:否则,array
中不会存储任何更改。
无论如何,每个人都会遇到的主要问题是:为什么需要向量数组?..向量向量是一种更为优雅的解决方案。
更新:我错过了您忘记初始化i
和j
的事实。除了建议初始化它们之外,我还建议使用auto
关键字,该关键字将使变量保持未初始化状态是不可能的:
for (auto i=0UL; i < N; i++) {
doubleVec ¤tVec = array[i];
currentVec.resize(M);
for (auto j=0UL; j < M; j++)
currentVec[j] = std::rand();
}
0UL
表示无符号long类型的零。
如果这是一个绝对糟糕的想法,我将非常感谢您的反馈。
是的,这是一个非常糟糕的主意。具体来说,拥有裸露的指针是一个坏主意。与其手动分配动态数组,不如使用std::vector
之类的容器通常更好。
如何安全地释放分配给堆的向量数组?
通过使用向量代替手动动态数组。在这种情况下,一种简单的解决方案是使用向量的向量。
一种可能更好的解决方案是分配一个单一的平面向量,该向量的大小为1000 * 1000的两倍,其中每个“子向量”的元素都一个接一个。这需要一些简单的数学运算来计算子向量的索引,但是在大多数情况下要更快。
其他说明:
typedef std::vector<double> doubleVec;
通过隐藏这样的类型名称来避免混淆程序。
for (long j; j < M; j++) ^^^^^^
您保留此变量未初始化。以后使用不确定的值时,程序的行为是不确定的。
此外,您忘记了包含定义std::vector
和std::rand
的标准标头。
我遇到段故障
关于您没有将任何元素实际添加到数组中的向量上的其他答案。这和未初始化的变量是最可能导致段错误的原因,具体取决于“执行某项操作”。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。