![]() |
Модераторы: Daevaorn |
![]() ![]() ![]() |
|
Toohtik |
|
|||
![]() Шустрый ![]() Профиль Группа: Awaiting Authorisation Сообщений: 142 Регистрация: 30.1.2006 Где: Харьков Репутация: нет Всего: нет |
Взялся писать курсовой. Его задание написать прогу которая читает txt файлы и отображает информацию о нем (размер, количество букв, слов...) Интрефейс под Win32. Возник вопрос, стоит ли писать класс File в котором будет содератся инофрмация о файле и в котором можно будит считать/сохранить из файла или просто реализовать функциями?
И воторой:
Обязателько ли перед тем как выделить новую, осводить старую и не лучше ли использваоть new delete? Это сообщение отредактировал(а) Toohtik - 12.4.2007, 20:34 |
|||
|
||||
fantast |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 147 Регистрация: 10.12.2006 Где: минск, столица на шей Родины Репутация: 2 Всего: 2 |
если ты не сделаешь free то просто затрешь старый указатель на ранее выделенную память, и впоследствии не сможешь ею воспользоваться или хотяб освободить, а новой выделенной памятью будешь пользоваться в полной мере. Можно конечно и не освобождать, но это приведет к утечке памяти. а new delete работает точно также, поэтому если и тут не освобождать, то результат будет идентичный лично я не вижу между ними никаких принципиальных различий --------------------
Эпитафия: Он старался. Неизвестный |
|||
|
||||
console |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 307 Регистрация: 12.2.2007 Где: Belarus::Minsk Репутация: 1 Всего: 3 |
new/delete - это для С++, calloc и прочая фень - СИ...
Для твоего случая конечно лучше new/delete и я думаю реализовать класс лучше... А вот это предложение ты объясни поподробнее... ))) |
|||
|
||||
fantast |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 147 Регистрация: 10.12.2006 Где: минск, столица на шей Родины Репутация: 2 Всего: 2 |
это только твое дело, но мне кажется если самые светлые умы программирования всетаки сделали такую замечательную штуку как класс, ей грех не воспользоватья, программа станет намного нагляднее и красивее. --------------------
Эпитафия: Он старался. Неизвестный |
|||
|
||||
leniviy |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 552 Регистрация: 8.2.2003 Где: Спб Репутация: 1 Всего: 5 |
alloc или new - это имхо без разницы, главное, не пытаться освободить память оператором delete, если вы её получили функцией calloc. new - более стандартный способ.
освобождать память надо, только не забудьте в конструкторе обнулить cText и проверять cText != NULL. |
|||
|
||||
fantast |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 147 Регистрация: 10.12.2006 Где: минск, столица на шей Родины Репутация: 2 Всего: 2 |
console,
ну над этим можно и поспорить, что new/delete, что calloc/free, теже яйца, только в профиль --------------------
Эпитафия: Он старался. Неизвестный |
|||
|
||||
Toohtik |
|
|||
![]() Шустрый ![]() Профиль Группа: Awaiting Authorisation Сообщений: 142 Регистрация: 30.1.2006 Где: Харьков Репутация: нет Всего: нет |
Ну имеется в виду что память особождать только после заверешения программы, а не каждый раз перед открытием файла.
Просто меня смущает вопрос, что если открыть текст размером 100 байт а потом к примеру 50 байт, то если не особождая перед откртием, память просто затрется, но в воздухе повиснит оставшиеся 50байт. Получается их уже нельзя не осободить не использовать, тоесть происходит утечка, я прав? |
|||
|
||||
fantast |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 147 Регистрация: 10.12.2006 Где: минск, столица на шей Родины Репутация: 2 Всего: 2 |
для этого если используешь calloc есть функция realloc, которая меняет длинну массива выделенного динамически.
ну а если new тогда надо каждый раз зачищать delete вот
да, ты прав. это никуда не годится Это сообщение отредактировал(а) fantast - 12.4.2007, 20:58 --------------------
Эпитафия: Он старался. Неизвестный |
|||
|
||||
leniviy |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 552 Регистрация: 8.2.2003 Где: Спб Репутация: 1 Всего: 5 |
это правда курсовая????
|
|||
|
||||
fantast |
|
||||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 147 Регистрация: 10.12.2006 Где: минск, столица на шей Родины Репутация: 2 Всего: 2 |
если ты напишешь:
то у тебя ничего не затрется, просто ты выделишь 100 байт и вернешь на них указатель в ch, а после этого выделишь еще 50 байт и опять запишешь на них указатель в ch. получается что указатель на первые 100 байт просто потерялся и ты не сможешь получить к ним доступ потому что банально не знаешь где они находятся а ch будет указывать на 50 байт. поэтому ты потеряешь не 50 байт а все 100. --------------------
Эпитафия: Он старался. Неизвестный |
||||
|
|||||
Toohtik |
|
|||
![]() Шустрый ![]() Профиль Группа: Awaiting Authorisation Сообщений: 142 Регистрация: 30.1.2006 Где: Харьков Репутация: нет Всего: нет |
А как воспользоватся функций realloc?
Да это курсовой 2 курса. Были и потруднее темы но там блин игры писать брррр ненавижу ![]() |
|||
|
||||
Mayk |
|
|||
![]() ^аВаТаР^ сообщение>> ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 2616 Регистрация: 22.5.2005 Где: за границей разум а Репутация: 45 Всего: 134 |
М-ду calloc и new [] есть существенная разница ---
1) calloc не вызвает конструкторы, в отличие от new[] 2) new[] не обнуляет выделенную память. В отличие от calloc -------------------- Здесь был кролик. Но его убили. Человеки < кроликов, йа считаю. |
|||
|
||||
console |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 307 Регистрация: 12.2.2007 Где: Belarus::Minsk Репутация: 1 Всего: 3 |
Пример с cplusplus.com:
|
|||
|
||||
fantast |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 147 Регистрация: 10.12.2006 Где: минск, столица на шей Родины Репутация: 2 Всего: 2 |
ну это ты зря кажется так void* realloc(void *mass,int size); *mass - указатель на динамический массив (уже созданный при помощи функции malloc или calloc) size - новый размер массива в байтах функция возвращает новый указатель на динамический массив (в дльнейшем использовать именно его) --------------------
Эпитафия: Он старался. Неизвестный |
|||
|
||||
console |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 307 Регистрация: 12.2.2007 Где: Belarus::Minsk Репутация: 1 Всего: 3 |
Как видим из примера с cplusplus.com в моем предыдущем посте, не обязательно перед этим резервировать память calloc'ом либо malloc'ом
|
|||
|
||||
fantast |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 147 Регистрация: 10.12.2006 Где: минск, столица на шей Родины Репутация: 2 Всего: 2 |
хм, моя училка по программированию меня жестко наколола ![]() --------------------
Эпитафия: Он старался. Неизвестный |
|||
|
||||
console |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 307 Регистрация: 12.2.2007 Где: Belarus::Minsk Репутация: 1 Всего: 3 |
cplusplusDOTcom:
ptr (см в коде)
Указатель на блок памяти, зарезервированный malloc, calloc или realloc, необходимый для переопределения размера... Если указатель нулевой, резервируется новый блок и функция realloc возвращает указатель на нее... |
|||
|
||||
Toohtik |
|
|||
![]() Шустрый ![]() Профиль Группа: Awaiting Authorisation Сообщений: 142 Регистрация: 30.1.2006 Где: Харьков Репутация: нет Всего: нет |
Я затронул эту тему из за того что в новокупленой книжке было написано что лучше использовать new/delete, так что Mayk, с тобой согласен.
Вот только не могу понять какой плюс от вызова конструктора при использовании new, объясните плиз! console, как вообщем realloc пользоваться я знаю, т.к. курсовой я уже написал, а это думаю его немного улучшить ![]() |
|||
|
||||
fantast |
|
||||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 147 Регистрация: 10.12.2006 Где: минск, столица на шей Родины Репутация: 2 Всего: 2 |
сначало ch указывал на 100 байт, а ты его (массив) расширели до 150 байт --------------------
Эпитафия: Он старался. Неизвестный |
||||
|
|||||
Toohtik |
|
|||
![]() Шустрый ![]() Профиль Группа: Awaiting Authorisation Сообщений: 142 Регистрация: 30.1.2006 Где: Харьков Репутация: нет Всего: нет |
а что произойдет если размер указать не 150, а 50, утечка памяти?
|
|||
|
||||
fantast |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 147 Регистрация: 10.12.2006 Где: минск, столица на шей Родины Репутация: 2 Всего: 2 |
не лишнее просто отрежется
--------------------
Эпитафия: Он старался. Неизвестный |
|||
|
||||
console |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 307 Регистрация: 12.2.2007 Где: Belarus::Minsk Репутация: 1 Всего: 3 |
У тебя урежется массив... и исчезнут данные, которые были в диапазоне [51;100]
|
|||
|
||||
Toohtik |
|
|||
![]() Шустрый ![]() Профиль Группа: Awaiting Authorisation Сообщений: 142 Регистрация: 30.1.2006 Где: Харьков Репутация: нет Всего: нет |
Тогда получается, что функцию free можно использовать 1 раз при завершении программы?
И воторой вопрос немного не потеме: где лучше писать пользовательские функции. Т.е. у меня есть модуль под класс и надо еще несколько функций для общего использования в проге. Надо ли их выносить в отдельный cpp и если да то надо ли создавать h файл для заголовка функций? |
|||
|
||||
fantast |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 147 Регистрация: 10.12.2006 Где: минск, столица на шей Родины Репутация: 2 Всего: 2 |
дело твое, я б сказал индивидуальное
к чему больше душа лежит там и описывай свои функции если проект пишет несколько людей то да, удобнее это не объединять в один cpp, а каждый делает свою часть кода, запихивает в свой cpp, а дальше дело компилятора (если конечно все пространство имен у них были верно согласованы)
если ты используешь free то динамически выделенный массив перестает существовать, а указатель, что раньше указывал на массив будет указывать на случайное место в памяти, другими словами он будет пуст. если есть необходимость можно его опять пустить в дело, например опять выделить динамический массив, или использовать его как обычный указатель, вобщем дело хозяйское --------------------
Эпитафия: Он старался. Неизвестный |
|||
|
||||
console |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 307 Регистрация: 12.2.2007 Где: Belarus::Minsk Репутация: 1 Всего: 3 |
Можно по разному... лучше конечно вынести в отдельный .cpp и .h
|
|||
|
||||
nickless |
|
||||||
![]() Гентозавр ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2976 Регистрация: 29.8.2005 Где: Germany Репутация: 19 Всего: 181 |
Если выделять память под сложные объекты, то нужен вызов конструктора для их инициализации, или прийдётся извращатся через дополнительный вызов какого-нибудь метода, который делает то же, что делает new + конструктор. Например:
Получаем:
-------------------- ![]() Real men don't use backups, they post their stuff on a public ftp server and let the rest of the world make copies - Linus Torvalds |
||||||
|
|||||||
Toohtik |
|
|||
![]() Шустрый ![]() Профиль Группа: Awaiting Authorisation Сообщений: 142 Регистрация: 30.1.2006 Где: Харьков Репутация: нет Всего: нет |
Возникла следующая проблемма. Все работает на ура, но при выходе из програмы выскакивает ошибка. Я это связываю с действиями деструктора, т.к. если его закоментировать, то все ок
|
|||
|
||||
Daevaorn |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2155 Регистрация: 29.11.2004 Где: Москва Репутация: 51 Всего: 70 |
проверяй свой код на правильность работы с памятью. выходы за переделы массива и т.п. Добавлено через 36 секунд
Ну можно позвать и конструктор вручную. |
|||
|
||||
JackYF |
|
|||
![]() полуавантюрист ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 5814 Регистрация: 28.8.2004 Где: страна тысячи озё р Репутация: 18 Всего: 162 |
||||
|
||||
Daevaorn |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2155 Регистрация: 29.11.2004 Где: Москва Репутация: 51 Всего: 70 |
||||
|
||||
nickless |
|
|||
![]() Гентозавр ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2976 Регистрация: 29.8.2005 Где: Germany Репутация: 19 Всего: 181 |
А зачем, если можно просто использовать new? -------------------- ![]() Real men don't use backups, they post their stuff on a public ftp server and let the rest of the world make copies - Linus Torvalds |
|||
|
||||
JackYF |
|
|||
![]() полуавантюрист ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 5814 Регистрация: 28.8.2004 Где: страна тысячи озё р Репутация: 18 Всего: 162 |
Могу, конечно, зарыться головой в стандарт. Но, может быть, ты просто покажешь пример? |
|||
|
||||
Daevaorn |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2155 Регистрация: 29.11.2004 Где: Москва Репутация: 51 Всего: 70 |
||||
|
||||
JackYF |
|
|||
![]() полуавантюрист ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 5814 Регистрация: 28.8.2004 Где: страна тысячи озё р Репутация: 18 Всего: 162 |
||||
|
||||
Daevaorn |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2155 Регистрация: 29.11.2004 Где: Москва Репутация: 51 Всего: 70 |
||||
|
||||
console |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 307 Регистрация: 12.2.2007 Где: Belarus::Minsk Репутация: 1 Всего: 3 |
ЧТО ЭТО????!!!! ![]() |
|||
|
||||
JackYF |
|
|||
![]() полуавантюрист ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 5814 Регистрация: 28.8.2004 Где: страна тысячи озё р Репутация: 18 Всего: 162 |
Да, когда шел домой и было время подумать, дошло, что ты хотел сказать. Что ж, спасибо. Да, действительно, и так можно ![]() |
|||
|
||||
![]() ![]() ![]() |
Правила форума "С++:Общие вопросы" | |
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |