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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Выделенение и освобождение RAM разными способами, в классе 
V
    Опции темы
Voldemar2004
Дата 13.11.2006, 15:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1650
Регистрация: 25.12.2004

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



Решил поэкспериментировать с динамической памятью. В общем память, выделенная с помощью malloc() - должна освобождаться функцией free(). А new - с помощью delete <объект/тип> или delete []<объект/тип>. Хочу изменить в методе Add() класса MyArray размер динамической памяти с помощью старой функции realloc() языка С - нормально.

Вопрос такой: а хорошо/плохо то, что в деструкторе не free(), а delete [] при том, что в одном из методов используется realloc?
Код


using namespace std;

class MyArray{

private:

int *array;
unsigned int n;

public:

        MyArray(void);

        ~MyArray(void);

void Add(int);

void Randomizer(unsigned int);

};
        MyArray::MyArray(void):n(0), array(0)
        {
        }

        MyArray::~MyArray(void)
        {
        delete []array;
        }

        void MyArray::Randomizer(unsigned int count)
        {
        array = new int [ count ];
        n = count;
        for(int i=0; i<n; ++i) array[i] = rand();
        }

        void MyArray::Add(int Element)
        {
                if(!n)
                {
                 n++;
                 array = new int [1];
                 array[n-1] = Element;
                }

                else
                {
                 array = (int*)realloc(array, (n+1)*sizeof(int));
                 array[n++] = Element;
                }
        }


Это сообщение отредактировал(а) Voldemar2004 - 13.11.2006, 15:35


--------------------
i_i 
(';') 
(V)

user posted image
PM MAIL   Вверх
EvgenZ
Дата 13.11.2006, 15:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Freedom in me
**


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

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



Майерс точнобы заплакал  smile , если используешь new, надо использовать delete... вроде так.


--------------------
<удалено администрацией форума>
PM MAIL   Вверх
AlexST
Дата 13.11.2006, 16:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Канешь очень плохо. По стандарту: " Результат вызова delete для указателя, который не был получен из new, не определен".  smile 
PM MAIL ICQ   Вверх
Voldemar2004
Дата 14.11.2006, 14:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1650
Регистрация: 25.12.2004

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



Так я и использую new и delete соответственно. Просто в методе Add() расширение памяти делается с помощью realloc().


--------------------
i_i 
(';') 
(V)

user posted image
PM MAIL   Вверх
JackYF
Дата 14.11.2006, 16:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Нет. По идее realloc использовать тоже нельзя. 
По причине, что указал AlexST. Лучше взять и перевыделить... Если громоздко - завернуть в отдельную функцию...


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


Опытный
**


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

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



Voldemar2004, calloc, malloc,  free, realloc реализованы на одном алгоритме. new/delete - это другое.

Цитата(Voldemar2004 @  14.11.2006,  14:11 Найти цитируемый пост)
Так я и использую new и delete соответственно. Просто в методе Add() расширение памяти делается с помощью realloc().
Сам себе противоречишь: всё-таки используешь realloc вместе с new.  smile 


Это сообщение отредактировал(а) AlexST - 14.11.2006, 19:02
PM MAIL ICQ   Вверх
Rockie
Дата 14.11.2006, 20:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1143
Регистрация: 23.4.2006

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



Цитата(Voldemar2004 @  13.11.2006,  15:24 Найти цитируемый пост)
Вопрос такой: а хорошо/плохо то, что в деструкторе не free(), а delete [] при том, что в одном из методов используется realloc?


Voldemar2004, полагаю плохо и вот почему: To new is C++; To malloc is C; To mix them is sin


--------------------
Чтобы иметь большой гардероб - надо иметь большой гардероб.
PM   Вверх
Voldemar2004
Дата 15.11.2006, 12:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1650
Регистрация: 25.12.2004

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



Rockie, я тоже читал недавно эту страницу. smile 
Цитата(JackYF @  14.11.2006,  16:26 Найти цитируемый пост)
Лучше взять и перевыделить...
На форуме читал, по-моему через вектор?
Цитата(JackYF @  14.11.2006,  16:26 Найти цитируемый пост)
Если громоздко - завернуть в отдельную функцию...
Получается очень громоздко. Лучше уж тогда отдельная функция.


--------------------
i_i 
(';') 
(V)

user posted image
PM MAIL   Вверх
EvgenZ
Дата 15.11.2006, 13:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Freedom in me
**


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

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



Зачем через вектор? Можно просто создать массив большей длинны чем нынешний, копируешь туда значения из маленького, удаляешь маленький массив и создаешь его заново увеличив размер, затем переносишь из вспомогательного массива данные в свой заново роженный и удаляешь вспомогательный. 


--------------------
<удалено администрацией форума>
PM MAIL   Вверх
dumb
Дата 15.11.2006, 13:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


sceloglauxalbifacies
****


Профиль
Группа: Экс. модератор
Сообщений: 2929
Регистрация: 16.6.2006

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



EvgenZ, эм. а вспомогательный то зачем вообще? smile
PM MAIL   Вверх
BUGOR
Дата 15.11.2006, 14:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Ну кстати на системном уровне пара  new/delete аналогична malloc/free, просто появилась чуть позже, уже в С++, а вот что она там по стандартам возвращает я не в курсе.


--------------------
Живу недоумевая, всё время хочу понять...
http://hunger.ru 
PM MAIL WWW ICQ   Вверх
EvgenZ
Дата 15.11.2006, 14:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Freedom in me
**


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

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



А как? Как создать массив большего размера из массива не используя вспомогательного с сохранением данных?



--------------------
<удалено администрацией форума>
PM MAIL   Вверх
JackYF
Дата 15.11.2006, 15:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Заранее выделять хотя бы в 2 раза больше, чем надо... в особых критичных случаях...
Как это, например, делает большинство STL- контейнеров.


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


Эксперт
****


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

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



Цитата(JackYF @  15.11.2006,  16:25 Найти цитируемый пост)
Заранее выделять хотя бы в 2 раза больше, чем надо... в особых критичных случаях...
Как это, например, делает большинство STL- контейнеров. 

С самых распрастраненных реализациях STL коэффициент около 1.5
PM MAIL WWW   Вверх
JackYF
Дата 15.11.2006, 18:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Daevaorn, ну пускай будет 1.5... Суть остается неизменной...


--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
Страницы: (3) Все [1] 2 3 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

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

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

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

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


 




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


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

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