Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 9, средняя оценка - 4.89
stanis-morozov
15 / 15 / 1
Регистрация: 18.03.2012
Сообщений: 91
#1

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

05.04.2012, 17:28. Просмотров 1137. Ответов 11
Метки нет (Все метки)

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

программа завершается аварийно - C++
запускаю компилятор, все запустилось, работает (меню из кучи условий if-else). выбираю любой пункт меню и он работает, после этого надо...

Рекурсия, почему программа завершается аварийно? - C++
Подскажите, почему не работает рекурсия?? #include <iostream> using namespace std; void fn(int value) { fn(value); } int...

Программа аварийно завершается после оператора scanf - C++
Такая проблема. Я начинающий. Занимаюсь уже вторую неделю. Написал такой код, запускаю программа. Все хорошо, но стоит дойти программе до...

Программа аварийно завершается с ошибкой "map/set iterators are incompatible" - C++
Добрый день! Проблема такая: в s1 и s2 рандомно добавляю числа, хочу найти объединение этих множеств. Если использовать такой код, то все в...

Динамическая память, проблемы с освобождением - C++
Всем привет! Проблема стара как этот мир, но есть некая отличительная черта по которой я создал эту тему. Задача следующая. Создаю файл...

Проблаем с освобождением памяти - C++
Работаю в Visual Studio C++ Express написал вот такой простой код: int main(){ char *n; n=new char; n="Text"; delete n; ...

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

На строчке с delete программа вылетает.
0
panicwassano
592 / 560 / 20
Регистрация: 07.11.2010
Сообщений: 2,004
05.04.2012, 22:54 #7
если у тебя 1500 строк почему ты не воспользуешься std::vector? непонятно
0
silent_1991
Эксперт С++
4987 / 3044 / 149
Регистрация: 11.11.2009
Сообщений: 7,027
Завершенные тесты: 1
06.04.2012, 14:34 #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" самый верный.
0
stanis-morozov
15 / 15 / 1
Регистрация: 18.03.2012
Сообщений: 91
06.04.2012, 15:58  [ТС] #9
Переписал с использованием vector.
Вылетает на строке a.resize(leng);
0
silent_1991
Эксперт С++
4987 / 3044 / 149
Регистрация: 11.11.2009
Сообщений: 7,027
Завершенные тесты: 1
06.04.2012, 16:17 #10
stanis-morozov, значит точно выходите за границы. перепишите с использованием std::vector::at() и посмотрите, где вываливается исключение.
1
stanis-morozov
15 / 15 / 1
Регистрация: 18.03.2012
Сообщений: 91
06.04.2012, 17:28  [ТС] #11
silent_1991, спасибо вам огромное! Да, действительно, я вылезал за граница массива, но с помощью at() все нашлось. Теперь хоть знаю, как с этим бороться...
0
taras atavin
3570 / 1753 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
06.04.2012, 23:36 #12
Цитата Сообщение от stanis-morozov Посмотреть сообщение
Размер массива меняю так:
создаю массив int b[n + 2];
копирую массив a в массив b.
delete [] a;
a = new int[new_leng];
копирую b в a.
А надо присвоить a=b.
0
06.04.2012, 23:36
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
06.04.2012, 23:36
Привет! Вот еще темы с ответами:

Не могу разобраться с классами и освобождением памяти - C++
Есть задача. Создать класс матрица Данный класс содержит указатель на float, размер строк и столбцов и состояние ошибки. Определить...

По Лафору пример, программа останавливается на строке delete[] name; - C++
#include &lt;iostream&gt; #include &lt;cstring&gt; char *getname(void); using namespace std; int main() { char *name = getname();...

Динамическое размещение объекта в определённом месте памяти с последующим её освобождением - C++
Доброго времени суток. В C++ имеется возможность размещать объект по чётко определённому, указанному разработчиком, адресу в памяти. В...

Работа с матрицами (программа завершается аварийно) - C (СИ)
Помогите, на Си, не С++. Выдает другие значения, к тому же аварийно завершает программу Для заданной матрицы B(n × n) и матрицы того же...


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

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru