LINUX.ORG.RU

Проблема с освобождением памяти в С++


0

0

Создаю два динамических массива:

int **array_2d;
float *array_1d;

array_1d = new float[L-1]

array_2d = new int* [L-1];
for (int i=0; i<=L-1; i++)
   array_2d[i] = new int[L-1];


Работаю с ними, перед выходом пытаюсь освободить память:


delete [] array_1d;

for (int i=0; i<=L-1; i++)
  delete[] array_2d[i];

delete[] array_2d;


Компилируется все на ура. Но вот при выполнении, именно в момент первого вызова delete[] вылетает с таким вот сообщением:

*** glibc detected *** free(): invalid next size (fast): 0x0804a008 ***
Aborted


$ g++ -v
Using built-in specs.
Target: i586-suse-linux
Configured with: ../configure --enable-threads=posix --prefix=/usr --with-local-prefix=/usr/local --infodir=/usr/share/info --mandir=/usr/share/man --libdir=/usr/lib --libexecdir=/usr/lib --enable-languages=c,c++,objc,f95,java,ada --disable-checking --with-gxx-include-dir=/usr/include/c++/4.0.2 --enable-java-awt=gtk --disable-libjava-multilib --with-slibdir=/lib --with-system-zlib --enable-shared --enable-__cxa_atexit --without-system-libunwind --host=i586-suse-linux
Thread model: posix
gcc version 4.0.2 20050901 (prerelease) (SUSE Linux)

glibc - 2.3.5
★★★

Чувствую, что грабли где-то в объявлении массивов. Если написать так:

float *array_1d = new float[L-1]

то все работает. Но мне такой способ не подходит. У меня переменные объявляются глобально, а массивы создаются намного позже...

Как обойти сию проблему?

Jeepston ★★★
() автор топика

Ошибка здесь

array_2d = new int* [L-1];
for (int i=0; i<=L-1; i++)
   array_2d[i] = new int[L-1];

Массив array2d выделяется на L-1 элементов, а заполняется
L элементами. Сделай 

array_2d = new int* [L];

Должно помочь.

anonymous
()
Ответ на: комментарий от anonymous

Таки да. Премного благодарен. Сбило с толку то, что при объявлении обычного массива на L элементов пишем int array[L-1]...

Jeepston ★★★
() автор топика

смотри:

int* a = new int[2];
int* b = new int[2];

a[2] = 3; // ну, например, так. Типичная ошибка, запись 
// за пределы массива.

delete[] b; // тут наверняка улетит
delete[] a; 

Короче, советую искать подобную ошибку.

devinull ★★
()
Ответ на: комментарий от Jeepston

в квадратных скобках пишется количество элементов, а не номер последнего

Reset ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.