Доброго времени суток! Нуждаюсь в вашей помощи. Есть такой код: (идея: 2 и 3-мерный масивы. под оба виделяется память и тут же оба удаляются. Утечки памяти нет, после удаления прога займет в ОЗУ примерно 2,5 мб (как и до запуска)).
Код | . . . int n = 10; double ***Ar2, **B; void __fastcall TForm1::Button3Click(TObject *Sender) { Ar2 = new double**[n]; B = new double *[n];
for (int k=0; k<n; k++) { Ar2[k] = new double*[n]; B[k] = new double[n]; } for (int k=0; k<n; k++) for (int j=0; j<n; j++) { Ar2[k][j] = new double[n]; B[k][j] = j; }
//удаление масивов for (int k=0; k<n; k++) for (int j=0; j<n; j++) delete[] Ar2[k][j]; for (int k=0; k<n; k++) { delete[] Ar2[k]; delete[] B[k]; }
delete[] Ar2; delete[] B; }
|
теперь модифицирую код так, чтобы в один з элементов 3-хмерного масива копировался двухмерный. Тогда в цыклах удаления надо убрать этот 2-мерный масив В, так как при присваивании он уничтожается(?) и оператор delete[] выдает ошыбку. Перед помещением в 3-мерный из него удаляется содержимое для устранения засорения памяти. В таком коде есть утечка памяти.
Код | int n = 10; double ***Ar2, **B; void __fastcall TForm1::Button3Click(TObject *Sender) { Ar2 = new double**[n]; B = new double *[n];
for (int k=0; k<n; k++) { Ar2[k] = new double*[n]; B[k] = new double[n]; } for (int k=0; k<n; k++) for (int j=0; j<n; j++) { Ar2[k][j] = new double[n]; B[k][j] = j; //заполнение масива данными }
delete[] Ar2[1]; //удаление содержымого Ar2[1] = B; //удаление масивов for (int k=0; k<n; k++) for (int j=0; j<n; j++) delete[] Ar2[k][j]; for (int k=0; k<n; k++) { delete[] Ar2[k]; // delete[] B[k]; ******ошыбка доступа к несуществующему элементу******* }
delete[] Ar2; delete[] B; }
|
Можете подсказать, в чем проблема? во втором случае при каждом нажатии кнопки прога кушает ~500 кб ОЗУ. Вроде бы немного, но этот код - часть цыкла генетического алгоритма, исчислений там очень много, поэтому довольно быстро прога доходит до 2 Гб и вилетает из ошыбкой виделения памяти. (если просто элементам присваивать значения вроде Ar2[1][2][4] = 8, то никаких проблем нет). И как бить, если надо вместо Ar2[1] = B; написать Ar2[1] = func (параметры), тоесть присвоить одному из элементов значениие функции. которая возвращает указатель на 2-мерный масив? |