在C ++中重新分配三维数组

时间:2012-10-02 17:45:13

标签: c++ arrays multidimensional-array delete-operator

我在头文件中创建这样的数组:

double (*arrayName)[b][c];

并在cpp文件中分配它:

arrayName= new double[a][b][c];

其中a,b和c是基于我正在处理的数据大小的常量。

如何解除分配此数组?我尝试在Deallocation of 3 dimensional array中执行建议,但这给了我一个“警告C4154:删除数组表达式;转换为指针提供”并导致堆损坏错误。

我不想更改为向量,因为我正在处理重新利用的旧代码,但需要保持与原始代码类似。我已经不得不从使用静态分配更改为新/删除,因为我们正在使用的数据规模溢出了堆栈。

编辑:WhozCraig的方法似乎是正确的。我认为我释放这个数组的方式(以及其他类似的)是我的问题,但我注意到我的代码中的另一个问题。我想我已经解决了这个问题,一旦我的程序重新运行(至少需要一两天),我会报告回来。感谢所有回复的人。

编辑2:事情仍然没有100%工作,但问题超出了这个问题的范围,我能够调整一些值,以使事情运行良好,完成工作。再次感谢所有回复的人。

1 个答案:

答案 0 :(得分:10)

vector-delete应该适用于此。

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()