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

Поиск:

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


Шустрый
*


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

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



Цитата
 не обязательно 


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


Опытный
**


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

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



cplusplusDOTcom:


ptr (см в коде)

Цитата

Pointer to a memory block previously allocated with malloc, calloc or realloc to be reallocated.
If this is NULL, a new block is allocated and a pointer to it is returned by the function.


Указатель на блок памяти, зарезервированный malloc, calloc или realloc, необходимый для переопределения размера...
Если указатель нулевой, резервируется новый блок и функция realloc возвращает указатель на нее...


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


Шустрый
*


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

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



Я затронул эту тему из за того что в новокупленой книжке было написано что лучше использовать new/delete, так что Mayk, с тобой согласен.
Вот только не могу понять какой плюс от вызова конструктора при использовании new, объясните плиз!
console, как вообщем realloc пользоваться я знаю, т.к. курсовой я уже написал, а это думаю его немного улучшитьsmile А вот как изменить длину массива?
 


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


Шустрый
*


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

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



Цитата
А вот как изменить длину массива?


Код

char *ch=calloc(100,sizeof(char));
ch=realloc(ch,150*sizeof(char));


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


Шустрый
*


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

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



а что произойдет если размер указать не 150, а 50, утечка памяти?
PM ICQ   Вверх
fantast
Дата 12.4.2007, 21:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



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


Опытный
**


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

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



У тебя урежется массив... и исчезнут данные, которые были в диапазоне [51;100]


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


Шустрый
*


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

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



Тогда получается, что функцию free можно использовать 1 раз при завершении программы?
И воторой вопрос немного не потеме: где лучше писать пользовательские функции. Т.е. у меня есть модуль под класс и надо еще несколько функций для общего использования в проге. Надо ли их выносить в отдельный cpp и если да то надо ли создавать h файл для заголовка функций?
PM ICQ   Вверх
fantast
Дата 12.4.2007, 22:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



 дело твое, я б сказал индивидуальное
к чему больше душа лежит там и описывай свои функции

если проект пишет несколько людей то да, удобнее это не объединять в один cpp, а каждый делает свою часть кода, запихивает в свой cpp, а дальше дело компилятора (если конечно все пространство имен у них были верно согласованы)


Цитата(Toohtik @  12.4.2007,  21:57 Найти цитируемый пост)
Тогда получается, что функцию free можно использовать 1 раз при завершении программы?

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


Опытный
**


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

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



Можно по разному... лучше конечно вынести в отдельный .cpp и .h


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


Гентозавр
****


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

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



Цитата(Toohtik @  12.4.2007,  20:35 Найти цитируемый пост)
Вот только не могу понять какой плюс от вызова конструктора при использовании new, объясните плиз!

Если выделять память под сложные объекты, то нужен вызов конструктора для их инициализации, или прийдётся извращатся через дополнительный вызов какого-нибудь метода, который делает то же, что делает new + конструктор.
Например:
Код
#include <iostream>
#include <cstdlib>
using namespace std;

class A
{
public:
    A() : mP( new double[200] ) { cout << "A()" << endl; };
    ~A() { delete[] mP; cout << "~A()" << endl; }
    void test() { for ( int i = 0; i < 200; i++ ) { mP[i] = 1234.56789; } }
private:
    double * mP;
};

int main()
{
    // new / delete
    cout << "test new/delete" << endl;
    A * bla = new A;
    bla->test(); // ok
    delete bla;

    // calloc / free
    cout << "test calloc / free" << endl;
    A * blub = (A*)calloc( 1, sizeof(A) );
    blub->test(); // ups...
    free( blub );

    return 0;
}

Получаем:
Код
$ g++ -Wall -Wextra -pedantic -pipe -o bla bla.cpp
$ ./bla
test new/delete
A()
~A()
test calloc / free
Segmentation fault



--------------------
user posted image

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
PM MAIL   Вверх
Toohtik
Дата 16.4.2007, 00:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Возникла следующая проблемма. Все работает на ура, но при выходе из програмы выскакивает ошибка. Я это связываю с действиями деструктора, т.к. если его закоментировать, то все ок
Код

class File
{
public:
    ~File();                                //деструктор    
    char* cText;                            // указатель на текст из файла    
    ...
    
private:
          ...

};
File::~File()
{
    free(cText);
}

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


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2155
Регистрация: 29.11.2004
Где: Москва

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



Цитата(Toohtik @  16.4.2007,  01:09 Найти цитируемый пост)
Возникла следующая проблемма. Все работает на ура, но при выходе из програмы выскакивает ошибка. Я это связываю с действиями деструктора, т.к. если его закоментировать, то все ок

проверяй свой код на правильность работы с памятью. выходы за переделы массива и т.п.

Добавлено через 36 секунд
Цитата(nickless @  12.4.2007,  23:38 Найти цитируемый пост)
или прийдётся извращатся через дополнительный вызов какого-нибудь метода

Ну можно позвать и конструктор вручную.
PM MAIL WWW   Вверх
JackYF
Дата 16.4.2007, 16:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


полуавантюрист
****


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

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



Цитата(Daevaorn @  16.4.2007,  00:21 Найти цитируемый пост)
Ну можно позвать и конструктор вручную. 

Хм... по стандарту?



--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
Daevaorn
Дата 16.4.2007, 17:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2155
Регистрация: 29.11.2004
Где: Москва

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



Цитата(JackYF @  16.4.2007,  17:54 Найти цитируемый пост)
Хм... по стандарту?

абсолютно
PM MAIL WWW   Вверх
Страницы: (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.0887 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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