错误:取消分配2D阵列

时间:2014-01-14 19:04:58

标签: c++ arrays memory-management

我正在开发一个程序,其中一个任务是从文本文件中读取点(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;

然后我的程序停止工作并显示“Project.exe停止工作”。

如果我没有解除分配,程序就可以正常工作。

4 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:1)

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

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

答案 2 :(得分:0)

(Thanx很多建议!!)

最后,我使用向量表示所述问题的原因如下:

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

2.在矢量类

下定义了许多内置方法
  1. 矢量大小可以在以后阶段扩展
  2. 以下是我使用2D Vector存储点(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
    
       }
    

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

答案 3 :(得分:-1)

对于多数组,我建议使用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;
相关问题