我正在开发一个程序,其中一个任务是从文本文件中读取点(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停止工作”。
如果我没有解除分配,程序就可以正常工作。
答案 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.在矢量类
下定义了许多内置方法以下是我使用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;