Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум программистов > C/C++: Общие вопросы > new/delete или calloc/free |
Автор: Toohtik 12.4.2007, 20:33 | ||
Взялся писать курсовой. Его задание написать прогу которая читает txt файлы и отображает информацию о нем (размер, количество букв, слов...) Интрефейс под Win32. Возник вопрос, стоит ли писать класс File в котором будет содератся инофрмация о файле и в котором можно будит считать/сохранить из файла или просто реализовать функциями? И воторой:
Обязателько ли перед тем как выделить новую, осводить старую и не лучше ли использваоть new delete? |
Автор: console 12.4.2007, 20:45 |
new/delete - это для С++, calloc и прочая фень - СИ... Для твоего случая конечно лучше new/delete и я думаю реализовать класс лучше... А вот это предложение ты объясни поподробнее... ))) |
Автор: fantast 12.4.2007, 20:45 | ||
это только твое дело, но мне кажется если самые светлые умы программирования всетаки сделали такую замечательную штуку как класс, ей грех не воспользоватья, программа станет намного нагляднее и красивее. |
Автор: leniviy 12.4.2007, 20:46 |
alloc или new - это имхо без разницы, главное, не пытаться освободить память оператором delete, если вы её получили функцией calloc. new - более стандартный способ. освобождать память надо, только не забудьте в конструкторе обнулить cText и проверять cText != NULL. |
Автор: fantast 12.4.2007, 20:47 | ||
console,
ну над этим можно и поспорить, что new/delete, что calloc/free, теже яйца, только в профиль |
Автор: Toohtik 12.4.2007, 20:51 |
Ну имеется в виду что память особождать только после заверешения программы, а не каждый раз перед открытием файла. Просто меня смущает вопрос, что если открыть текст размером 100 байт а потом к примеру 50 байт, то если не особождая перед откртием, память просто затрется, но в воздухе повиснит оставшиеся 50байт. Получается их уже нельзя не осободить не использовать, тоесть происходит утечка, я прав? |
Автор: fantast 12.4.2007, 20:57 | ||
для этого если используешь calloc есть функция realloc, которая меняет длинну массива выделенного динамически. ну а если new тогда надо каждый раз зачищать delete вот
да, ты прав. это никуда не годится |
Автор: leniviy 12.4.2007, 21:00 |
это правда курсовая???? |
Автор: fantast 12.4.2007, 21:03 | ||||
если ты напишешь:
то у тебя ничего не затрется, просто ты выделишь 100 байт и вернешь на них указатель в ch, а после этого выделишь еще 50 байт и опять запишешь на них указатель в ch. получается что указатель на первые 100 байт просто потерялся и ты не сможешь получить к ним доступ потому что банально не знаешь где они находятся а ch будет указывать на 50 байт. поэтому ты потеряешь не 50 байт а все 100. |
Автор: Toohtik 12.4.2007, 21:19 |
А как воспользоватся функций realloc? Да это курсовой 2 курса. Были и потруднее темы но там блин игры писать брррр ненавижу ![]() |
Автор: Mayk 12.4.2007, 21:24 |
М-ду calloc и new [] есть существенная разница --- 1) calloc не вызвает конструкторы, в отличие от new[] 2) new[] не обнуляет выделенную память. В отличие от calloc |
Автор: console 12.4.2007, 21:25 | ||
Пример с cplusplus.com:
|
Автор: fantast 12.4.2007, 21:27 |
ну это ты зря кажется так void* realloc(void *mass,int size); *mass - указатель на динамический массив (уже созданный при помощи функции malloc или calloc) size - новый размер массива в байтах функция возвращает новый указатель на динамический массив (в дльнейшем использовать именно его) |
Автор: console 12.4.2007, 21:29 |
Как видим из примера с cplusplus.com в моем предыдущем посте, не обязательно перед этим резервировать память calloc'ом либо malloc'ом |
Автор: fantast 12.4.2007, 21:32 | ||
хм, моя училка по программированию меня жестко наколола ![]() |
Автор: console 12.4.2007, 21:33 | ||
cplusplusDOTcom: ptr (см в коде)
Указатель на блок памяти, зарезервированный malloc, calloc или realloc, необходимый для переопределения размера... Если указатель нулевой, резервируется новый блок и функция realloc возвращает указатель на нее... |
Автор: Toohtik 12.4.2007, 21:35 |
Я затронул эту тему из за того что в новокупленой книжке было написано что лучше использовать new/delete, так что Mayk, с тобой согласен. Вот только не могу понять какой плюс от вызова конструктора при использовании new, объясните плиз! console, как вообщем realloc пользоваться я знаю, т.к. курсовой я уже написал, а это думаю его немного улучшить ![]() |
Автор: fantast 12.4.2007, 21:43 | ||||
сначало ch указывал на 100 байт, а ты его (массив) расширели до 150 байт |
Автор: Toohtik 12.4.2007, 21:46 |
а что произойдет если размер указать не 150, а 50, утечка памяти? |
Автор: fantast 12.4.2007, 21:48 |
не лишнее просто отрежется |
Автор: console 12.4.2007, 21:49 |
У тебя урежется массив... и исчезнут данные, которые были в диапазоне [51;100] |
Автор: Toohtik 12.4.2007, 21:57 |
Тогда получается, что функцию free можно использовать 1 раз при завершении программы? И воторой вопрос немного не потеме: где лучше писать пользовательские функции. Т.е. у меня есть модуль под класс и надо еще несколько функций для общего использования в проге. Надо ли их выносить в отдельный cpp и если да то надо ли создавать h файл для заголовка функций? |
Автор: fantast 12.4.2007, 22:05 | ||
дело твое, я б сказал индивидуальное к чему больше душа лежит там и описывай свои функции если проект пишет несколько людей то да, удобнее это не объединять в один cpp, а каждый делает свою часть кода, запихивает в свой cpp, а дальше дело компилятора (если конечно все пространство имен у них были верно согласованы)
если ты используешь free то динамически выделенный массив перестает существовать, а указатель, что раньше указывал на массив будет указывать на случайное место в памяти, другими словами он будет пуст. если есть необходимость можно его опять пустить в дело, например опять выделить динамический массив, или использовать его как обычный указатель, вобщем дело хозяйское |
Автор: console 12.4.2007, 22:06 |
Можно по разному... лучше конечно вынести в отдельный .cpp и .h |
Автор: nickless 12.4.2007, 22:38 | ||||||
Если выделять память под сложные объекты, то нужен вызов конструктора для их инициализации, или прийдётся извращатся через дополнительный вызов какого-нибудь метода, который делает то же, что делает new + конструктор. Например:
Получаем:
|
Автор: Toohtik 16.4.2007, 00:09 | ||
Возникла следующая проблемма. Все работает на ура, но при выходе из програмы выскакивает ошибка. Я это связываю с действиями деструктора, т.к. если его закоментировать, то все ок
|
Автор: Daevaorn 16.4.2007, 00:21 | ||||
проверяй свой код на правильность работы с памятью. выходы за переделы массива и т.п. Добавлено через 36 секунд
Ну можно позвать и конструктор вручную. |
Автор: JackYF 16.4.2007, 16:54 |
Хм... по стандарту? |
Автор: Daevaorn 16.4.2007, 17:35 |
абсолютно |
Автор: nickless 16.4.2007, 17:39 |
А зачем, если можно просто использовать new? |
Автор: JackYF 16.4.2007, 21:19 |
Могу, конечно, зарыться головой в стандарт. Но, может быть, ты просто покажешь пример? |
Автор: Daevaorn 16.4.2007, 21:24 | ||
placement new ещё никто не отменял, поэтому создать объект можно на любой памяти. не понимаю, что у тебя вызвало затруднение. |
Автор: JackYF 16.4.2007, 21:33 | ||
Э, нет ![]() ![]() ![]() |
Автор: Daevaorn 16.4.2007, 21:55 | ||
тебе не кажется это соседство странным?)
|
Автор: console 16.4.2007, 22:46 |
ЧТО ЭТО????!!!! ![]() |
Автор: JackYF 16.4.2007, 23:57 |
Да, когда шел домой и было время подумать, дошло, что ты хотел сказать. Что ж, спасибо. Да, действительно, и так можно ![]() |