Ошибка при удалении выделенной памяти в C ++ - PullRequest
0 голосов
/ 28 апреля 2011

Я новичок в C ++ и пытаюсь понять правильный способ освобождения памяти массива.Я получаю следующую ошибку при попытке удалить выделенный массив указателей: «освобожденный указатель не был выделен».

Мой указатель определен как:

T * al ;
al = new T[top] ;

В то время как мой деструктор длякласс, в котором указатель al определен в:

for( int i = 0 ; i < current ; i++ )
        delete( al+i ) ;
    delete [] al ;

Деструктор для class T:

for( int i = 0 ; i < length ; i++ )
        delete( p+1 ) ;
delete [] p ;

Где p определяется как:

char *p ;
length = strlen( str ) ;
p = new char[length] ;
strcpy( p, str ) ;

Как правильно распределить память и / или как это исправить?

Ответы [ 2 ]

2 голосов
/ 28 апреля 2011

Просто используйте delete [], а не цикл в дополнение.delete [] удалит каждый элемент массива.

Кроме того, ваш цикл в деструкторе класса T пытается удалить p+1 вместо p+i

0 голосов
/ 28 апреля 2011

Чтобы быть конкретным, вы должны delete вот так:

int *a = new int; // One allocated
delete a;         // So delete one

int *b = new int[50]; // 50 allocated
delete[] b;           // Just use delete[], don't delete every one

int **c = new int*[50]; // 50 pointers to ints
for (int i = 0; i < 50; i++)
    c[i] = new int;     // each c[i] points to a pointer to a new int

for (int i = 0; i < 50; i++)
    delete c[i];
delete[] c;

Используйте delete при использовании new, delete[] при использовании new[].


На самом деле неправильно делать следующее:

int *a = new int[50];

// do stuff...

for (int i = 0; i < 50; i++)
   delete &a[i]; // equivalent to delete (a + i);
delete[] a;

Вы делаете только delete[] a, но не delete (a + i).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...