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

Поиск:

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


Опытный
**


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

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



Цитата(BUGOR @  15.11.2006,  14:06 Найти цитируемый пост)
Ну кстати на системном уровне пара  new/delete аналогична malloc/free, просто появилась чуть позже, уже в С++
Malloc это допотопная функция, тупо выделяющая память, компилятор для которой даже не в состоянии проверить правильность возврата указателя (идёт void). New с ней по функциональности даже нечего сравнивать.  smile 

Я уже не говорю о том, что free не подчистит хорошо за new, а delete за malloc (и т. п.) напороть может.

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


Эксперт
****


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

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



Цитата(AlexST @  15.11.2006,  20:32 Найти цитируемый пост)
New с ней по функциональности даже нечего сравнивать

Во многих реализациях в new вызывется malloc.
PM MAIL WWW   Вверх
BUGOR
Дата 15.11.2006, 20:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата

Malloc это допотопная функция, тупо выделяющая память, компилятор для которой даже не в состоянии проверить правильность возврата указателя (идёт void). New с ней по функциональности даже нечего сравнивать.  


Я же сказал на системном уровне. И та, и другая пара использует HeapAlloc/HeapFree, а насчёт введения дополнительных проверок и того, что она возаращет я уже кажется сказал. 


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


Опытный
**


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

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



Цитата(Daevaorn @  15.11.2006,  20:06 Найти цитируемый пост)
Во многих реализациях в new вызывется malloc.
Канешь.  smile 

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


Эксперт
***


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

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



Если честно, так и не понял зачем выделять лишний массив. Создать новый требуемой размерности, скопировать туда элементы из изначального, поменять местами указатели и убить старый массив.


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


Эксперт
***


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

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



Цитата(EvgenZ @  15.11.2006,  14:13 Найти цитируемый пост)
 копируешь туда значения из маленького, удаляешь маленький массив и создаешь его заново увеличив размер, затем переносишь из вспомогательного массива данные в свой заново роженный и удаляешь вспомогательный. 
М-да. Я так и не нашел нигде как обойти malloc и сделать все через new, у Страуструпа тоже нет.

Добавлено @ 23:06 
Цитата(Daevaorn @  15.11.2006,  21:06 Найти цитируемый пост)
Во многих реализациях в new вызывется malloc.
Попробовал свой вышеописанный код - все нормуль, вроде бы.



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

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


Freedom in me
**


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

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



Код

#include <iostream>
int main(){
int SIZE =5, max = SIZE, i=0, ch;
int* Arr = new int[SIZE];
std::cout << "vvedi chislo";
std::cin >> ch;
while(ch != 0){
    Arr[i++] = ch;
    if(i == max){
        int* vsArr = new int [max + SIZE];
        for(int i = 0; i < max; ++i)
            vsArr[i] = Arr[i];
        delete [] Arr;
        Arr = new int[max+SIZE];
        for(int i = 0; i < max; ++i)
            Arr[i] = vsArr[i];
         max+=SIZE;
         delete [] vsArr;
    } 
std::cout << "vvedi chislo";
std::cin >> ch;
}
return 0;
}


кривовато, но смысл отображает, я это имел ввиду.

Добавлено @ 00:32 
Код

void* buf = operator new(10*sizeof(char));
//...
//...
operator delete(buf);

эквиваленты malloc & free


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


Эксперт
***


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

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



Цитата(Voldemar2004 @  15.11.2006,  23:02 Найти цитируемый пост)
 Я так и не нашел нигде как обойти malloc и сделать все через new, у Страуструпа тоже нет.

вот попробовал, покритикуйте пожалуйста. smile

Код
#include<iostream>

using namespace std;


void FillArray(int * array, int size)        // заполнение массива по порядку
 {
    for(int i=0;i<size;i++)
      array[i] = i;
 }

void DisplayArray(int * array, int size)     // распечатка массива  
 {
    cout<< endl;
    for(int i=0;i<size;i++)
      cout<< array[i] << ' ';
 }


int* ResizeArray(int * array, int size, int new_size)  // изменение размера массива
 {
    int * changed_array = new int[new_size];           // создание нового массива  

    for(int i=0;i<size;i++)                            // копирование содержимого старого в новый,
      changed_array[i] = array[i];                     // нужна защита в случае когда размер нового массива меньше старого

    delete [] array;                                   // уничтожение старого

    return array = changed_array;                      // возвращаемый пойнтер указывает на новый массив
 }


int main(){

  const int n = 5;

  int * array = new int[n];             // создание массива

  FillArray(array,n);                                           

  DisplayArray(array,n);               

  array = ResizeArray(array,n,n+10);    // изменение размера  

  DisplayArray(array,n+10);               

  delete [] array;                      // delete отработает уже по новому массиву

  cin.get();
  return 0;
}



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


Freedom in me
**


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

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





Добавлено @ 10:21 
Цитата

 // нужна защита в случае когда размер нового массива меньше старого

а это как, если ты пишешь, что новый у тебя на 10 больше старого?

Это сообщение отредактировал(а) EvgenZ - 16.11.2006, 17:04


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


Бывалый
*


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

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



Интуиция подсказывает, что лучше не 1.5, а золотое сечение  smile . Доказать не могу  smile 
PM MAIL   Вверх
EvgenZ
Дата 16.11.2006, 14:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Freedom in me
**


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

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



Что такое золотое сечение?


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


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


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

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



EvgenZ, приблизительно 1.61...

Добавлено @ 14:26 
Если точнее, то ( "корень из 5" -1 ) / 2


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


sceloglauxalbifacies
****


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

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



Цитата(EvgenZ @  16.11.2006,  10:19 Найти цитируемый пост)
Ты удалил array, но новый не создал! И возвращаешь вообще непонятно что. Тут идет передача того чего нет и утечка памяти.

перечитай еще два раза код функции ResizeArray. она для работы не годится, но суть верна.
PM MAIL   Вверх
Rockie
Дата 16.11.2006, 16:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Цитата(EvgenZ @  16.11.2006,  10:19 Найти цитируемый пост)
Уверен, сто работает не правильно. Ты удалил array, но новый не создал! И возвращаешь вообще непонятно что. Тут идет передача того чего нет и утечка памяти.

программу запускал?

Цитата(EvgenZ @  16.11.2006,  10:19 Найти цитируемый пост)
а это как, если ты пишешь, что новый у тебя на 10 больше старого?

на случай если вместо 
Код
 array = ResizeArray(array,n,n+10);    // изменение размера  
 задать 
Код
 array = ResizeArray(array,n,n-1);    // это пример  



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


Freedom in me
**


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

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



Вот сейчас запустил...  извиняюсь  smile 
Код

    delete [] array;                             
    return changed_array;    

вот это мне не понятно, откуда новый берется? И собственно почему вообще работает   smile 

т.е. это получается, что создается временный changed_array который присваивается в main size'у и потом удаляется? Почему тогда size куда-то указывает? Почему не ругается на return size = сhanged_array;   ?

Это сообщение отредактировал(а) EvgenZ - 16.11.2006, 18:03


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


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

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