C++;:如何安全地解除分配堆分配的向量数组? 我目前正在使用代码,目前我需要制作一个向量数组(我是C++的新手——如果这是一个绝对可怕的想法,我会非常感激反馈)。
假设我在堆上为向量分配内存,如下所示:C++;:如何安全地解除分配堆分配的向量数组? 我目前正在使用代码,目前我需要制作一个向量数组(我是C++的新手——如果这是一个绝对可怕的想法,我会非常感激反馈)。,c++,vector,memory-management,heap-memory,dynamic-memory-allocation,C++,Vector,Memory Management,Heap Memory,Dynamic Memory Allocation,假设我在堆上为向量分配内存,如下所示: #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 (lon
#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;
}
#包括
#包括
#包括
int main(){
typedef std::向量doubleVec;
长N=1000;
长M=1000;
doubleVec*数组=新的doubleVec[N];
用于(长i=0;i
当我已经完成了所有需要处理的数据时,我应该如何安全地解除分配此数据结构
注意:在我的初始帖子中,还有一些我不想成为讨论焦点的错误(未初始化变量、未调整向量大小等)。我现在修好了。感谢大家指出这些问题。问题不在于取消分配,而在于每个向量分配。您在代码中的什么位置使用M
值(访问元素时除外)?您的代码中还有其他问题,因此快速解决方法是:
for (long i; i < N; i++) {
doubleVec ¤tVec = array[i];
currentVec.resize(M);
for (long j; j < M; j++)
currentVec[j] = std::rand();
}
0UL
表示无符号长类型的零
如果这是一个绝对糟糕的想法,我将非常感谢您的反馈)
是的,这是一个非常糟糕的主意。具体来说,拥有裸指针是个坏主意。与手动分配动态数组不同,通常最好使用容器,如std::vector
如何安全地解除分配堆分配的向量数组
通过使用向量代替手动动态数组。在这种情况下,一个简单的解决方案是使用向量的向量
一个可能更好的解决方案是分配一个大小为1000*1000的双精度平面向量,其中每个“子向量”的元素依次排列。这需要一点简单的数学来计算子向量的索引,但在大多数用例中速度更快
其他说明:
typedef std::vector doubleVec;
通过像这样隐藏类型名来避免混淆程序
(长j;j
^^^^^^
未初始化此变量。当以后使用不确定值时,程序的行为是未定义的
此外,您忘了包含定义std::vector
和std::rand
的标准头
我有seg故障
请参阅另一个答案,该答案与您没有实际向数组中的向量添加任何元素有关。这和未初始化的变量是SEGDULT最可能的原因,这取决于“做点什么”的作用。使用智能指针,例如:
std::unique\u ptr
而不是原始指针,但“点”是“为什么需要一堆指针”?您不使用std::vector
作为array
的原因是什么?您使用new[]
创建了它;您可以使用delete[]
销毁它。不要想得太多。因为我在判断上犯了严重而持续的错误。还有什么更好的选择呢?我应该做数组还是向量向量?(我稍微意识到这是一个愚蠢的问题)@Gromulus Romulus见第二段。向量向量会更好吗,因为这样我就不用考虑指针了?我可以通过引用传递到任何使用它的函数?Seg故障现在已修复。这些都是由于我没有正确初始化变量造成的。
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();
}
typedef std::vector<double> doubleVec;
for (long j; j < M; j++)
^^^^^^