在 C++ 中重新分配 3 维数组
Posted
技术标签:
【中文标题】在 C++ 中重新分配 3 维数组【英文标题】:Deallocation of 3 dimensional array in C++ 【发布时间】:2012-10-02 17:45:13 【问题描述】:我在头文件中创建这样的数组:
double (*arrayName)[b][c];
并在 cpp 文件中像这样分配它:
arrayName= new double[a][b][c];
其中 a、b 和 c 是基于我正在处理的数据大小的常量。
如何释放这个数组?我尝试在Deallocation of 3 dimensional array 中提出建议,但这给了我“警告 C4154:删除数组表达式;转换为提供的指针”并导致堆损坏错误。
我不希望更改为向量,因为我正在处理正在重新调整用途但需要尽可能与原始代码保持相似的遗留代码。我已经不得不从使用静态分配更改为新建/删除,因为我们正在处理的数据规模正在溢出堆栈。
编辑:WhozCraig 的方法似乎是正确的。我认为我释放这个数组(以及其他类似的数组)的方式是我的问题,但我注意到我的代码中存在另一个问题。我想我已经解决了这个问题,我会在我的程序重新运行完成后报告(至少需要一两天)。感谢所有回复的人。
编辑 2:事情仍然没有 100% 工作,但问题超出了这个问题的范围,我能够调整一些值以使事情工作得足够好以完成工作。再次感谢所有回复的人。
【问题讨论】:
arrayName= new double[a][b][c];
编译?
使用 std::vector
而不是 C 风格的数组的可能性非常大。如果你真的坚持自己做(取消)分配,你最好只使用指针,而不是组合使用数组和指针。
***.com/questions/8579207/… 请参阅此答案以了解如何使用std::vector
【参考方案1】:
矢量删除应该适用于此。
static const int b = 10;
static const int c = 10;
double (*arrayName)[b][c] = NULL;
arrayName = new double[10][b][c];
delete [] arrayName;
如果你必须像这样动态地立即分配它,并且想要证明析构函数被正确触发......
#include <iostream>
using namespace std;
class MyObj
public:
MyObj() : val(1.0) ;
~MyObj() cout << "~MyObj()" << endl;
private:
double val;
;
int main()
static const int b = 3;
static const int c = 3;
MyObj (*arrayName)[b][c] = NULL;
arrayName = new MyObj[3][b][c];
delete [] arrayName;
return 0;
会产生以下输出(不用数,一共有27个)
~MyObj()
~MyObj()
~MyObj()
~MyObj()
~MyObj()
~MyObj()
~MyObj()
~MyObj()
~MyObj()
~MyObj()
~MyObj()
~MyObj()
~MyObj()
~MyObj()
~MyObj()
~MyObj()
~MyObj()
~MyObj()
~MyObj()
~MyObj()
~MyObj()
~MyObj()
~MyObj()
~MyObj()
~MyObj()
~MyObj()
~MyObj()
【讨论】:
这就是我正在做的。我不是 100% 确定它是否正确,因为我的程序内存不足,所以我认为我可能错误地解除了多维数组的分配。感谢您的验证!以上是关于在 C++ 中重新分配 3 维数组的主要内容,如果未能解决你的问题,请参考以下文章
用于创建 HDF5 数据集的 4 维 c++ 数组的动态内存分配