Форум программистов, компьютерный форум CyberForum.ru

Проблемы с delete [], программа периодически аварийно завершается на строке с освобождением памяти. - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 9, средняя оценка - 4.89
stanis-morozov
15 / 15 / 1
Регистрация: 18.03.2012
Сообщений: 91
05.04.2012, 17:28     Проблемы с delete [], программа периодически аварийно завершается на строке с освобождением памяти. #1
Добрый день!
Столкнулся со следующей задачей: в программе требуется довольно часто изменять размеры массива, для чего использую динамические массивы.
Объявляю массив так:
C++
1
int *a;
Выделяю под него память так:
C++
1
a = new int[n];
Освобождаю так:
C++
1
delete [] a;
Но при этом программа периодически аварийно завершается на строке с освобождением памяти. То есть она может 20 раз освободить и выделить память, а на 21-ый вылететь. Хотя перед освобождением массив всегда в рабочем состоянии и все элементы в нем доступны.
С чем может быть связано такое нежелание освобождать память?
Заранее благодарен!
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
05.04.2012, 17:28     Проблемы с delete [], программа периодически аварийно завершается на строке с освобождением памяти.
Посмотрите здесь:

C++ программа завершается аварийно
Динамическая память, проблемы с освобождением C++
C++ Проблаем с освобождением памяти
Динамическое размещение объекта в определённом месте памяти с последующим её освобождением C++
C++ Не могу разобраться с классами и освобождением памяти
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
panicwassano
590 / 558 / 20
Регистрация: 07.11.2010
Сообщений: 2,004
05.04.2012, 18:26     Проблемы с delete [], программа периодически аварийно завершается на строке с освобождением памяти. #2
код выкладывайте, delete вроде как не кидает исключения, только new
stanis-morozov
15 / 15 / 1
Регистрация: 18.03.2012
Сообщений: 91
05.04.2012, 22:11  [ТС]     Проблемы с delete [], программа периодически аварийно завершается на строке с освобождением памяти. #3
А вот с кодом будут проблемы...дело в том, что он у меня 1500 с лишним строк. А если я пытаюсь только самое главное выделить, то что поидее и должно не работать, то все работает...
Ну как, мне стоит свои 1500 строк выкладывать или их точно никто читать не будет?
Байт
 Аватар для Байт
13954 / 8785 / 1222
Регистрация: 24.12.2010
Сообщений: 15,903
05.04.2012, 22:16     Проблемы с delete [], программа периодически аварийно завершается на строке с освобождением памяти. #4
stanis-morozov, Попробуйте использовать malloc и realloc. Они хоть NULL возвращают, если что не так.
Nekto
342 / 287 / 10
Регистрация: 23.03.2012
Сообщений: 838
05.04.2012, 22:21     Проблемы с delete [], программа периодически аварийно завершается на строке с освобождением памяти. #5
а размеры массива как меняешь?
stanis-morozov
15 / 15 / 1
Регистрация: 18.03.2012
Сообщений: 91
05.04.2012, 22:39  [ТС]     Проблемы с delete [], программа периодически аварийно завершается на строке с освобождением памяти. #6
С malloc тоже ничего не получалось. На функции free все равно вылетает. А вот realloc надо будет попробывать. Там ведь не надо вручную память освобождать?
Размер массива меняю так:
создаю массив int b[n + 2];
копирую массив a в массив b.
delete [] a;
a = new int[new_leng];
копирую b в a.

На строчке с delete программа вылетает.
panicwassano
590 / 558 / 20
Регистрация: 07.11.2010
Сообщений: 2,004
05.04.2012, 22:54     Проблемы с delete [], программа периодически аварийно завершается на строке с освобождением памяти. #7
если у тебя 1500 строк почему ты не воспользуешься std::vector? непонятно
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
06.04.2012, 14:34     Проблемы с delete [], программа периодически аварийно завершается на строке с освобождением памяти. #8
stanis-morozov, программа может падать при delete, если где-то выше был выход за границы динамически выделенной памяти. Поверьте это.

Добавлено через 3 минуты
stanis-morozov, да и способ перевыделения у вас громоздкий. обычно делают так:
C++
1
2
3
4
5
6
7
8
9
int *new_array = new int [new_length];
 
for (size_t i = 0; i < old_length; ++i)
    new_array[i] = old_array[i];
 
delete [] old_array;
 
old_array = new_array;
old_length = new_length;
Но всё-таки совет "использовать std::vector" самый верный.
stanis-morozov
15 / 15 / 1
Регистрация: 18.03.2012
Сообщений: 91
06.04.2012, 15:58  [ТС]     Проблемы с delete [], программа периодически аварийно завершается на строке с освобождением памяти. #9
Переписал с использованием vector.
Вылетает на строке a.resize(leng);
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
06.04.2012, 16:17     Проблемы с delete [], программа периодически аварийно завершается на строке с освобождением памяти. #10
stanis-morozov, значит точно выходите за границы. перепишите с использованием std::vector::at() и посмотрите, где вываливается исключение.
stanis-morozov
15 / 15 / 1
Регистрация: 18.03.2012
Сообщений: 91
06.04.2012, 17:28  [ТС]     Проблемы с delete [], программа периодически аварийно завершается на строке с освобождением памяти. #11
silent_1991, спасибо вам огромное! Да, действительно, я вылезал за граница массива, но с помощью at() все нашлось. Теперь хоть знаю, как с этим бороться...
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
06.04.2012, 23:36     Проблемы с delete [], программа периодически аварийно завершается на строке с освобождением памяти.
Еще ссылки по теме:

Класс для динамических матриц. После ввода элементов матрицы программа аварийно закрывается C++
C++ По Лафору пример, программа останавливается на строке delete[] name;
C++ Не завершается программа

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
06.04.2012, 23:36     Проблемы с delete [], программа периодически аварийно завершается на строке с освобождением памяти. #12
Цитата Сообщение от stanis-morozov Посмотреть сообщение
Размер массива меняю так:
создаю массив int b[n + 2];
копирую массив a в массив b.
delete [] a;
a = new int[new_leng];
копирую b в a.
А надо присвоить a=b.
Yandex
Объявления
06.04.2012, 23:36     Проблемы с delete [], программа периодически аварийно завершается на строке с освобождением памяти.
Ответ Создать тему
Опции темы

Текущее время: 22:56. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru