![]() |
|
Модераторы: Daevaorn |
![]()
|
|
| brb |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 190 Регистрация: 7.1.2003 Репутация: нет Всего: нет |
Я старый(и по возрасту тоже
PayState *ptr; // класс поинтер вестимо PayState *pPayState[1200]; for (i = 0; pPayState[i] != NULL; i++ )delete pPayState[i]; // я думал, что тут я освобождаю всю занятую память i = 0; do { ptr = new PayState ( bc, ic ); // конструктор - аллокирует новую запись if ( ptr != NULL ){ // успешно bc = ptr->Balance(); // какой-то дурацкий код... ic = ptr->Bank(); pPayState[i++] = ptr; //Поместить в массив для дальнейших нужд } else { ShowMessage ("Not enough memory, Sorry"); exit ( EXIT_FAILURE ); } } while ( bc ); // больше записей нет! Хоть и С++, но все так, как и должно быть в С. Итог - не работает Тот же пример но в С++ (говорю честно, срисовал без понимания) delete[] pPayState; // ЧТО ЖЕ ЭТО ЗА ТАКОЕ i = 0; do { ptr = new PayState ( bc, ic ); if ( ptr != NULL ){ bc = ptr->Balance(); ic = ptr->Bank(); pPayState[i++] = ptr; } else { ShowMessage ("Not enough memory, Sorry"); exit ( EXIT_FAILURE ); } } while ( bc ); Так - нет проблем! Люди грамотные, объясните в чем дело? Я и синтаксиса такого не знаю: delete[] pPayState; Заранее благодарен --------------------
Сказки - удивительная вещь! Самое удивительное, что в них верят только маленькие дети, которым их рассказывают мамы и мамы, которым их рассказывают подросшие дети. |
|||
|
||||
| Baa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 2639 Регистрация: 12.4.2002 Где: Москва Репутация: 8 Всего: 12 |
>Я и синтаксиса такого не знаю: delete[] pPayState;
char* lpBuffer = new char [0xFF]; delete [] lpBuffer; delete [] lpBuffer освобождает ВСЮ память, выделенную нами ранее под МАССИВ символов. -------------------- "Duty is everything; the greatest of joys, the deepest of sorrows" Aribeth de Tylmarande |
|||
|
||||
| brb |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 190 Регистрация: 7.1.2003 Репутация: нет Всего: нет |
>char* lpBuffer = new char [0xFF];
>delete [] lpBuffer; >delete [] lpBuffer освобождает ВСЮ память, выделенную нами ранее под МАССИВ >символов. А в чем же разница между delete [] lpBuffer; и delete lpBuffer; И то и другое освобождоют выделенный фрагмент памяти или надо как в Си free lpBuffer; a delete lpBuffer; не проходит? --------------------
Сказки - удивительная вещь! Самое удивительное, что в них верят только маленькие дети, которым их рассказывают мамы и мамы, которым их рассказывают подросшие дети. |
|||
|
||||
| skaa |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 9 Регистрация: 24.12.2002 Где: Skokie, IL Репутация: нет Всего: нет |
delete [] lpBuffer удаляет все элементы массива lpBuffer, а delete lpBuffer освобождает распределённую память, указатель на которую lpBuffer.
|
|||
|
||||
| brb |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 190 Регистрация: 7.1.2003 Репутация: нет Всего: нет |
skaa, замечательное наблюдение!
А как освободить незанятую память? Освободить от чего? Уважаемый, верните мне, пожалуйста, должок, который Вы у меня не брали! --------------------
Сказки - удивительная вещь! Самое удивительное, что в них верят только маленькие дети, которым их рассказывают мамы и мамы, которым их рассказывают подросшие дети. |
|||
|
||||
| Vaulter |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1724 Регистрация: 30.12.2002 Где: бункер Репутация: 2 Всего: 22 |
что у тебя в деструкторе PayState?
|
|||
|
||||
| brb |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 190 Регистрация: 7.1.2003 Репутация: нет Всего: нет |
Что Бог то бишь Борланд послал. А мысль в чем?
--------------------
Сказки - удивительная вещь! Самое удивительное, что в них верят только маленькие дети, которым их рассказывают мамы и мамы, которым их рассказывают подросшие дети. |
|||
|
||||
| Fantasist |
|
|||
|
Лентяй ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1517 Регистрация: 24.3.2002 Репутация: 4 Всего: 41 |
Не, какая-то ерунда. Надо бы узнать, что значит "не работает". Вот у тебя объявление:
PayState *pPayState[1200]; Это есть 1200 указателей на PayState, причем выделенных на стеке (или в сегменте данных, если она глобальная, но это детали). Применять к этой переменной delete[] ни в коем случае нельзя, и в цикле освобождать - правильное решение. delete применяется к указателям, память для которых была выделенна с помощью new, а delete[] применяется к указателям, память для которых была выделенна с помощью new[]. На первых порах этого достадочно. В принципе, на тему нужно ли delete[] и не достадочно ли просто delete, было много обсуждений, но по стандарту пока остается так. В основном разница в том, что выделяя память через new для классов, не нужно хранить количество выделенных элементов, чтобы знать сколько раз вызывать конструктор, и в delete не нужно их считывать. То есть, если оставить только delete, то это количество надо будет хранить всегда. Должен зказать, что в данном случае, по видимому, лучше использовать стандартные классы библиотеки С++, такие как std::vector, std::deque. В них можно запихивать объекты, и доставать их, вместе с тем не нужно заботиться об освобождении памяти - она будет освобождена автоматически при уничтожении контейнера. -------------------- Волны гасят ветер... |
|||
|
||||
| brb |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 190 Регистрация: 7.1.2003 Репутация: нет Всего: нет |
1. Массив поинтеров глобальный, но это действительно не важно.
2. Так как сколько всего мне их надо я не знаю и определяю в цикле, то и new[] использовать не могу. 3. Первоначальный вариант был написан, как бы я делал это через calloc и free на Си, но через new и delete. После нескольких итераций код улетал в никуда... 4. Прочитал в хэлпе: #include <except.h> #include <iostream.h> void display(long double **); void de_allocate(long double **); int m = 3; // THE NUMBER OF ROWS. int n = 5; // THE NUMBER OF COLUMNS. int main(void) { long double **data; try { // TEST FOR EXCEPTIONS. data = new long double*[m]; // STEP 1: SET UP THE ROWS. for (int j = 0; j < m; j++) data[j] = new long double[n]; // STEP 2: SET UP THE COLUMNS } catch (xalloc) { // ENTER THIS BLOCK ONLY IF xalloc IS THROWN. // YOU COULD REQUEST OTHER ACTIONS BEFORE TERMINATING cout << "Could not allocate. Bye ..."; exit(-1); } for (int i = 0; i < m; i++) for (int j = 0; j < n; j++)data[i][j] = i + j;// ARBITRARY INITIALIZATION display(data); de_allocate(data); return 0; } void display(long double **data) { for (int i = 0; i < m; i++) { for (int j = 0; j < n; j++)cout << data[i][j] << " "; cout << "\n" << endl; } } void de_allocate(long double **data) { for (int i = 0; i < m; i++)delete[] data[i];// STEP 1: DELETE THE COLUMNS delete[] data; // STEP 2: DELETE THE ROWS !!!!!!!!!!!!!!!!! } и сделал так же!!! Заработало. Обрати внимание и тут new в цикле, а не new[], как ты пишешь!!! А delete[] я взял в чистом виде. Хорошо бы это проверить и на другом, не борландовском компиляторе. --------------------
Сказки - удивительная вещь! Самое удивительное, что в них верят только маленькие дети, которым их рассказывают мамы и мамы, которым их рассказывают подросшие дети. |
|||
|
||||
| Fantasist |
|
||||||||
|
Лентяй ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1517 Регистрация: 24.3.2002 Репутация: 4 Всего: 41 |
На самом деле, вот это:
и вот это:
- это new[]. new - это вот так: data[j][n] = new long double; Так что, с точки зрения языка вышеприведенный код вполне верен. Разве что new бросает bad_alloc, а не xalloc. Но повторю еще раз - лучше воспользоваться классами стандартной библиотеки - они весьма эффективны и гораздо понятнее и безопаснее. Типа так (в простейшем варианте):
Ничего самому освобождать не надо. -------------------- Волны гасят ветер... |
||||||||
|
|||||||||
| brb |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 190 Регистрация: 7.1.2003 Репутация: нет Всего: нет |
во-первых, плохо понял твой пример. С классом матрица не знаком. Завера с утра повторю попытку.
во-вторых, это не ответ на вопрос почему не работает первоначальный код. в-третьих, а сам попробовал мой код, который не? Хотелось бы решать проблемы по мере возникновения, а не впрок. Спасибо. --------------------
Сказки - удивительная вещь! Самое удивительное, что в них верят только маленькие дети, которым их рассказывают мамы и мамы, которым их рассказывают подросшие дети. |
|||
|
||||
| Fantasist |
|
||||||||
|
Лентяй ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1517 Регистрация: 24.3.2002 Репутация: 4 Всего: 41 |
Это не класс матрицы - это класс массива (vector) мы делаем массив массивов, что не самый классный подход, но лучше, чем просто указатели.
Потому, что мне не понятно, что значит "не работает". Какие внешние признаки? При просмотре кода все выглядить вполне нормально.
Это какой "не"? Но в любом случае, код буду пробовать только если очень интересно, а так лень, извините-с.
Впрок их решать гораздо лучше. -------------------- Волны гасят ветер... |
||||||||
|
|||||||||
| brb |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 190 Регистрация: 7.1.2003 Репутация: нет Всего: нет |
Про ООП:
Их всех "мочить в сортире" надо как говорит российсктий президент, во главе и в первую очередь с Арафатом!!! Про "не" Вылетает по нарушению памяти после нескольких (3-4) проходов. --------------------
Сказки - удивительная вещь! Самое удивительное, что в них верят только маленькие дети, которым их рассказывают мамы и мамы, которым их рассказывают подросшие дети. |
|||
|
||||
| Fantasist |
|
||||||
|
Лентяй ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1517 Регистрация: 24.3.2002 Репутация: 4 Всего: 41 |
Я незнаю, насколько полно вы привели кусок кода (да и ошибки такие самому искать надо, с дебаггером) , однако вот тут:
Память освобождается, но поинтеры не обнуляются, а значит на каком-то проходе возможно напоротся на не нулевой поинтер, который указывает никуда.
Это к чему? Если вы принципиально не любите ООП, то незачем брать С++, так как Си, на мой взгляд, балее мощьный системный язык. -------------------- Волны гасят ветер... |
||||||
|
|||||||
| brb |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 190 Регистрация: 7.1.2003 Репутация: нет Всего: нет |
- фрагменты работы с памятью приведены дословно! Оба.
- это интересно! Т.е. я пытаюсь освободить СВОБОДНУЮ память! Тогда, наверняка, сработает защита памяти. for (i = 0; pPayState[i] != NULL; i++ ){ delete pPayState[i]; pPayState[i] = NULL; } Странно, только, что 3-4 прохода, это полный размер pPayState[]. Вот если бы вылетало на втором... - Попрошу не путать Object Oriented Programming(OOP), с которым я мирно сосуществую, и Организацию Освобождения Палестины(ООП), которую я действительно принципиально не признаю! А насчет того, что С гораздее, я полностью согласен. Удалено модератором --------------------
Сказки - удивительная вещь! Самое удивительное, что в них верят только маленькие дети, которым их рассказывают мамы и мамы, которым их рассказывают подросшие дети. |
|||
|
||||
![]()
|
| Правила форума "С++:Общие вопросы" | |
|
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |