Выделение трехмерного массива в переполнении стека

Я создаю массив, как это в заголовочном файле:

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

И расположить его так в файле cpp:

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

Где a, b и c — константы, основанные на размере данных, с которыми я имею дело.

Как освободить этот массив? Я пытался сделать предложение в Выделение трехмерного массива, но это дает мне «Предупреждение C4154: удаление выражения массива; преобразование в предоставленный указатель» и вызывает ошибку повреждения кучи.

Я предпочел бы не переходить на векторы, так как я работаю с устаревшим кодом, который переназначается, но должен оставаться максимально похожим на оригинал. Мне уже приходилось переходить от использования статического размещения к новому / удалению, поскольку масштаб данных, с которыми мы работаем, переполнял стек.

Изменить: метод WhozCraig кажется правильным. Я думал, что способ, которым я освобождаю этот массив (и другие подобные), был моей проблемой, но я заметил другую проблему в моем коде. Я думаю, что я исправил это, и я сообщу, как только моя программа будет выполнена повторно (займет день или два по крайней мере). Спасибо всем, кто откликнулся.

Изменить 2: Все еще не работает на 100%, но проблемы выходят за рамки этого вопроса, и я смог настроить некоторые значения, чтобы заставить вещи работать достаточно хорошо, чтобы выполнить работу. Еще раз спасибо всем, кто откликнулся.

4

Решение

Вектор-удаление должно работать для этого.

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

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]