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 &currentVec = 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 &currentVec = 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++)
      ^^^^^^