2015-12-06 1 views
0

У меня есть структура, которая должна «дышать», когда ее используют. Его матрица указателей. (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 освободить память.

+1

Почему бы не использовать 'std :: vector >>'? Тогда вы не получите утечек. Еще лучше, один «std :: vector » и имитировать 3d-массив, соответствующим образом изменяя индексы. Трехмерное ('***') программирование на C++ не является необходимостью в этот день и возраст. – PaulMcKenzie

+0

Спасибо за ваш ответ, не могу использовать вектор, я упустил некоторые спецификации, потому что это не важно :) – Alek988Alek

ответ

2

Вы назначаете массивы с помощью new [], но удаляете их с помощью оператора delete. Если вы выделяете что-то с помощью new [], вы должны удалить его, используя delete [], иначе вы вызываете неопределенное поведение.

Например, вы должны заменить этот код:

delete directory[p]; 

с этим:

delete[] directory[p]; 

То же самое относится ко всем другим вхождений удаления в коде вы публикуемую.

+0

это то, что происходит, когда вы код в Java на полгода ... Спасибо! :) – Alek988Alek

 Смежные вопросы

  • Нет связанных вопросов^_^