У меня есть структура, которая должна «дышать», когда ее используют. Его матрица указателей. (BigInt некоторый тип, не имеет значения, что это такое ...)Проблемы с удалением массивов (ошибка неизвестна мне)
BigInt ***directory;
инициализируется таким образом (размер матрицы M * M):
directory = new BigInt**[M];
for(int i=0;i<M;i++)
directory[i] = NULL;
и расширяется, когда это необходимо, таким образом:
partition = ...;
directory[partition] = new BigInt*[M];
for(int i=0;i<M;i++)
directory[partition][i] = NULL;
И разрушили этот путь (этот метод вызывается из деструктора класса, который имеет BigInt *** каталог как поле):
void del() {
for(int p=0;p<M;p++)
if(directory[p]!=NULL) {
for(int o=0;o<M;o++)
if(directory[p][o]!=NULL)
delete directory[p][o];
}
for(int p=0;p<M;p++)
if(directory[p]!=NULL)
delete directory[p];
delete directory;
}
В конце моей программы, однако, моя программа паузы (запускает контрольную точку) в dbgheap.c, по адресу:
/***
*int _CrtIsValidHeapPointer() - verify pointer is from 'local' heap
*
*Purpose:
* Verify pointer is not only a valid pointer but also that it is from
* the 'local' heap. Pointers from another copy of the C runtime (even in the
* same process) will be caught.
*
*Entry:
* const void * pUserData - pointer of interest
*
*Return:
* TRUE - if valid and from local heap
* FALSE otherwise
*
*******************************************************************************/
extern "C" _CRTIMP int __cdecl _CrtIsValidHeapPointer(
const void * pUserData
)
{
if (!pUserData)
return FALSE;
if (!_CrtIsValidPointer(pHdr(pUserData), sizeof(_CrtMemBlockHeader), FALSE))
return FALSE;
return HeapValidate(_crtheap, 0, pHdr(pUserData));
}
То же самое происходит, когда точка останова попытке освободить память, вызвав дель() или при попытке удалить один массив (когда матрица «дышит»), как это:
int p = ...;
delete directory[p];
Я никогда не происходил такого рода ошибки, и программа работает нормально, если я не» t освободить память.
Почему бы не использовать 'std :: vector >>'? Тогда вы не получите утечек. Еще лучше, один «std :: vector » и имитировать 3d-массив, соответствующим образом изменяя индексы. Трехмерное ('***') программирование на C++ не является необходимостью в этот день и возраст. –
PaulMcKenzie
Спасибо за ваш ответ, не могу использовать вектор, я упустил некоторые спецификации, потому что это не важно :) – Alek988Alek