Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> new/delete или calloc/free 
:(
    Опции темы
Toohtik
Дата 12.4.2007, 20:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Awaiting Authorisation
Сообщений: 142
Регистрация: 30.1.2006
Где: Харьков

Репутация: нет
Всего: нет



Взялся  писать курсовой. Его задание написать прогу которая читает txt файлы и отображает информацию о нем (размер, количество букв, слов...) Интрефейс под Win32. Возник вопрос, стоит ли писать класс File в котором будет содератся инофрмация о файле и в котором можно будит считать/сохранить из файла или просто реализовать функциями?

И воторой:
Код

void File::fOpenFile(void)
{
    free(cText);                           //освободить память
    hFile =    CreateFile(buf,GENERIC_READ,FILE_SHARE_READ,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);    
    DWORD b;                                //для хранения количества прочтенных байт
    iFileSize = GetFileSize(hFile,NULL);            //получения размера файла
    cText = (char*)calloc(iFileSize+1,sizeof(char));    //выделение под текст места                        
    ReadFile(hFile,cText,iFileSize,&b,NULL);
    fGetTextInformation();
    CloseHandle(hFile);
}

Обязателько ли перед тем как выделить новую, осводить старую и не лучше ли использваоть new delete?

 

Это сообщение отредактировал(а) Toohtik - 12.4.2007, 20:34
PM ICQ   Вверх
fantast
Дата 12.4.2007, 20:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 147
Регистрация: 10.12.2006
Где: минск, столица на шей Родины

Репутация: 2
Всего: 2



Цитата(Toohtik @  12.4.2007,  20:33 Найти цитируемый пост)
Обязателько ли перед тем как выделить новую, осводить старую и не лучше ли использваоть new delete?

если ты не сделаешь free то просто затрешь старый указатель на ранее выделенную память, и впоследствии не сможешь ею воспользоваться или хотяб освободить, а новой выделенной памятью будешь пользоваться в полной мере. Можно конечно и не освобождать, но это приведет к утечке памяти. 
а new delete работает точно также, поэтому если и тут не освобождать, то результат будет идентичный
лично я не вижу между ними никаких принципиальных различий
--------------------
Эпитафия: Он старался.                                   Неизвестный
PM MAIL   Вверх
console
Дата 12.4.2007, 20:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 307
Регистрация: 12.2.2007
Где: Belarus::Minsk

Репутация: 1
Всего: 3



new/delete - это для С++, calloc и прочая фень - СИ... 
Для твоего случая конечно лучше new/delete и я думаю реализовать класс лучше...
Цитата(Toohtik @  12.4.2007,  19:33 Найти цитируемый пост)
Обязателько ли перед тем как выделить новую, осводить старую

А вот это предложение ты объясни поподробнее... )))


--------------------
user posted image
Nothing is impossible
My WeBlog
PM MAIL WWW ICQ   Вверх
fantast
Дата 12.4.2007, 20:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 147
Регистрация: 10.12.2006
Где: минск, столица на шей Родины

Репутация: 2
Всего: 2



Цитата
 стоит ли писать класс File


это только твое дело, но мне кажется если самые светлые умы программирования всетаки сделали такую замечательную штуку как класс,
ей грех не воспользоватья, программа станет намного нагляднее и красивее.
--------------------
Эпитафия: Он старался.                                   Неизвестный
PM MAIL   Вверх
leniviy
Дата 12.4.2007, 20:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 552
Регистрация: 8.2.2003
Где: Спб

Репутация: 1
Всего: 5



alloc или new - это имхо без разницы, главное, не пытаться освободить память оператором delete, если вы её получили функцией calloc. new - более стандартный способ.
освобождать память надо, только не забудьте в конструкторе обнулить cText и проверять cText != NULL.

PM MAIL   Вверх
fantast
Дата 12.4.2007, 20:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 147
Регистрация: 10.12.2006
Где: минск, столица на шей Родины

Репутация: 2
Всего: 2



console
Цитата
конечно лучше new/delete


ну над этим можно и поспорить, 
что new/delete, что calloc/free, теже яйца, только в профиль
--------------------
Эпитафия: Он старался.                                   Неизвестный
PM MAIL   Вверх
Toohtik
Дата 12.4.2007, 20:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Awaiting Authorisation
Сообщений: 142
Регистрация: 30.1.2006
Где: Харьков

Репутация: нет
Всего: нет



Ну имеется в виду что память особождать только после заверешения программы, а не каждый раз перед открытием файла.
Просто меня смущает вопрос, что если открыть текст размером 100 байт а потом к примеру 50 байт, то если не особождая перед откртием, память просто затрется, но в воздухе повиснит оставшиеся 50байт. Получается их уже нельзя не осободить не использовать, тоесть происходит утечка, я прав?
PM ICQ   Вверх
fantast
Дата 12.4.2007, 20:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 147
Регистрация: 10.12.2006
Где: минск, столица на шей Родины

Репутация: 2
Всего: 2



для этого если используешь calloc есть функция realloc, которая меняет длинну массива выделенного динамически.
ну а если new тогда надо каждый раз зачищать delete
вот
Цитата
тоесть происходит утечка, я прав?


да, ты прав. это никуда не годится

Это сообщение отредактировал(а) fantast - 12.4.2007, 20:58
--------------------
Эпитафия: Он старался.                                   Неизвестный
PM MAIL   Вверх
leniviy
Дата 12.4.2007, 21:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 552
Регистрация: 8.2.2003
Где: Спб

Репутация: 1
Всего: 5



это правда курсовая????
PM MAIL   Вверх
fantast
Дата 12.4.2007, 21:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 147
Регистрация: 10.12.2006
Где: минск, столица на шей Родины

Репутация: 2
Всего: 2



Цитата
Просто меня смущает вопрос, что если открыть текст размером 100 байт а потом к примеру 50 байт, то если не особождая перед откртием, память просто затрется, но в воздухе повиснит оставшиеся 50байт.


если ты напишешь:
Код

char *ch=new char[100];
ch=new char[50];


то у тебя ничего не затрется, просто ты выделишь 100 байт и вернешь на них указатель в ch,
а после этого выделишь еще 50 байт и опять запишешь на них указатель в ch.
получается что указатель на первые 100 байт просто потерялся и ты не сможешь получить к ним доступ потому что банально не знаешь где они находятся а ch будет указывать на 50 байт.
поэтому ты потеряешь не 50 байт а все 100.
--------------------
Эпитафия: Он старался.                                   Неизвестный
PM MAIL   Вверх
Toohtik
Дата 12.4.2007, 21:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Awaiting Authorisation
Сообщений: 142
Регистрация: 30.1.2006
Где: Харьков

Репутация: нет
Всего: нет



А как воспользоватся функций realloc?
Да это курсовой 2 курса. Были и потруднее темы но там блин игры писать брррр ненавижуsmile

PM ICQ   Вверх
Mayk
Дата 12.4.2007, 21:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


^аВаТаР^ сообщение>>
****


Профиль
Группа: Участник
Сообщений: 2616
Регистрация: 22.5.2005
Где: за границей разум а

Репутация: 45
Всего: 134



М-ду calloc и new [] есть существенная разница --- 
1) calloc не вызвает конструкторы, в отличие от new[]
2) new[] не обнуляет выделенную память. В отличие от calloc




--------------------
 Здесь был кролик. Но его убили.
Человеки < кроликов, йа считаю.
PM MAIL WWW ICQ   Вверх
console
Дата 12.4.2007, 21:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 307
Регистрация: 12.2.2007
Где: Belarus::Minsk

Репутация: 1
Всего: 3



Пример с cplusplus.com: 

Код

include <stdio.h>
#include <stdlib.h>

int main ()
{
  int input,n;
  int count=0;
  int * numbers = NULL;

  do {
     printf ("Enter an integer value (0 to end): ");
     scanf ("%d", &input);
     count++;
     numbers = (int*) realloc (numbers, count * sizeof(int));
     if (numbers==NULL)
       { puts ("Error (re)allocating memory"); exit (1); }
     numbers[count-1]=input;
  } while (input!=0);

  printf ("Numbers entered: ");
  for (n=0;n<count;n++) printf ("%d ",numbers[n]);
  free (numbers);

  return 0;
}



--------------------
user posted image
Nothing is impossible
My WeBlog
PM MAIL WWW ICQ   Вверх
fantast
Дата 12.4.2007, 21:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 147
Регистрация: 10.12.2006
Где: минск, столица на шей Родины

Репутация: 2
Всего: 2



Цитата(Toohtik @  12.4.2007,  21:19 Найти цитируемый пост)
брррр ненавижу

ну это ты зря
кажется так
void* realloc(void *mass,int size);
*mass - указатель на динамический массив (уже созданный при помощи функции malloc или calloc)
size - новый размер массива в байтах

функция возвращает новый указатель на динамический массив (в дльнейшем использовать именно его)


--------------------
Эпитафия: Он старался.                                   Неизвестный
PM MAIL   Вверх
console
Дата 12.4.2007, 21:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 307
Регистрация: 12.2.2007
Где: Belarus::Minsk

Репутация: 1
Всего: 3



Как видим из примера с cplusplus.com в моем предыдущем посте, не обязательно перед этим резервировать память calloc'ом либо malloc'ом


--------------------
user posted image
Nothing is impossible
My WeBlog
PM MAIL WWW ICQ   Вверх
Страницы: (3) Все [1] 2 3 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1224 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.