4

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

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

并在 cpp 文件中像这样分配它:

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

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

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

我宁愿不要更改为向量,因为我正在使用正在重新利用但需要尽可能与原始代码保持相似的遗留代码。我已经不得不从使用静态分配更改为新建/删除,因为我们正在处理的数据规模正在溢出堆栈。

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

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

4

1 回答 1

10

矢量删除应该为此工作。

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()
于 2012-10-02T17:53:38.697 回答