错误:解除分配二维阵列

Error: Deallocating a 2D array

本文关键字:二维 阵列 解除分配 错误      更新时间:2023-10-16

我正在开发一个程序,其中一项任务是从文本文件中读取点(x,y 和 z),然后将它们存储在数组中。现在,文本文件可能包含 10^2 甚至 10^6 个点,具体取决于用户选择的文本文件。因此,我正在定义一个动态数组。

为了分配动态 2D 数组,我写了如下,它工作正常:

const int array_size = 100000;
float** array = new float* [array_size]; 
for(int i = 0; i < array_size; ++i){
    ary[i] = new float[2]; // 0,1,2 being the columns for x,y,z co-ordinates
}

将点保存在数组中后,我编写以下内容来释放未分配的内存:

for (int i = 0; i < array_size; i++){
    delete [] array[i];
}
delete [] array;

然后我的程序停止工作并显示"项目.exe停止工作"。

如果我不解除分配,程序运行良好。

在您的评论中,您说0,1,2 being the columns for x,y,z co-ordinates,如果是这种情况,则需要分配为float[3]。当你分配一个float[N]数组时,你正在分配一个大小为N * sizeof(float)的内存块,你将在数组中从1N - 1索引它们。因此,如果你需要 indeces 0,1,2 ,你需要分配一个大小为 3 * sizeof(float) 的内存,这使得它float[3]

因为除此之外,我可以编译和运行代码而不会出错。如果修复它但仍出现错误,则可能是编译器问题。然后尝试将100000减少到较小的数字,然后重试。

你是说你正在尝试实现一个动态数组,这就是std::vector所做的,我强烈建议你使用它。通过这种方式,您使用的是标准库中经过良好测试的内容,并且您不会通过本质上尝试推出自己的std::vector版本而遇到问题。此外,这种方法更好地包装内存,因为它使用 RAII,利用该语言来解决许多内存管理问题。这还有其他好处,例如使您的代码更加异常安全。

此外,如果您要存储 x,y,z 坐标,请考虑使用结构体或元组,我认为这会大大提高可读性。您也可以键入定义坐标类型。像std::vector< coord_t >这样的东西对我来说更具可读性。

(非常感谢建议!!

最后,我将向量用于所述问题,原因如下:

1.与数组(当然不是数组对象)不同,我不需要手动释放未分配的内存。

2.向量类下定义了大量内置方法

  1. 载体大小可以在后期阶段扩展

以下是我如何使用 2D 矢量来存储点(x,y,z 坐标)

初始化(分配内存)2D 向量:

          vector<vector<float>> array (1000, vector<float> array (3)); 

其中 1000 是行数,3 是列数

声明后,值可以简单地传递为:

                      array[i][j] = some value;

此外,在后期阶段,我将采用向量参数并返回向量的函数声明为:

          vector <vector <float>> function_name ( vector <vector <float>>);
   vector <vector <float>> function_name ( vector <vector <float>> input_vector_name)
   {
    return output_vector_name_created_inside_function
   }

注意:此方法在返回时将向量的副本装箱,使用指针通过引用返回。即使当我通过引用返回矢量时我的不起作用:(

对于多数组,我建议使用 boost::multi_array。例:

typedef boost::multi_array<double, 3> array_type;
array_type A(boost::extents[3][4][2]);
A[0][0][0] = 3.14;