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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> изменение памяти new и malloc, увеличить и уменьшить , как? 
V
    Опции темы
Syberex
Дата 4.10.2006, 13:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



есть трабла на это компиль ругается

   char *mass;
   mass=malloc(50);                 // не может преобразовать void  to char
   mass=realloc(mass,150);     // не может преобразовать void  to char
   free(mass);

не знаю чего??? необходимо выделить память, а потом увеличить её.Если интерестно тоже самое с new , ну типа 


char *mas=new char[100];

типа увеличить mas=оператор char[500];

как?
--------------------
whole power in artificial intelligences
PM MAIL ICQ   Вверх
Kuvaldis
Дата 4.10.2006, 13:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


механик-вредитель
***


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

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



Syberex, 
нужно так
Код

   char *mass;
   mass=(char*)malloc(50);               
   mass=(char*)realloc(mass,150);    
   free(mass);

Но так, как ты сделал, плохо. Во-первых, нет проверки на выделение.
Во-вторых, при использовании realloc() есть один неприятный подводный камень.
данная функция возвращает NULL, если память выделить не удалось.
Предположим, что для указателя mass память выделилась и в ней сидят данные.
После оператора
mass=(char*)realloc(mass,150);
происходит утечка памяти, так как указатель на старые данные затирается. Здесь нужно делать так (используем промежуточный указатель)
Код

 char *mass;
 char* temp;
   mass = (char*) malloc(50);               
   temp = (char*) realloc(mass, 150);  
   if (temp != NULL)
     mass = temp;  
   free(mass);
 

ASFAIK, для операторов new и delete нет аналога функции realloc(). Если очень нужно, то придется самому ее написать 



Это сообщение отредактировал(а) Kuvaldis - 4.10.2006, 14:00


--------------------
Помни - когда ты спишь, враг не дремлет
Спи чаще и дольше, изматывай врага бессоницей
PM MAIL ICQ   Вверх
Syberex
Дата 4.10.2006, 13:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



   char *mass;
   mass=(char*)malloc(50);               
   mass=(char*)realloc(mass,150);    
   free(mass);

это пашет чётко, сенкс, значит и такое должно пахать


   long *mass;
   mass=(long*)malloc(50);               
   mass=(long*)realloc(mass,150);    
   free(mass);

Да???  

а что действительно нет, для new такого?
--------------------
whole power in artificial intelligences
PM MAIL ICQ   Вверх
Kuvaldis
Дата 4.10.2006, 14:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


механик-вредитель
***


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

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



Syberex, 
1. для красивости кода используй кнопку "код" при вводе сообщения (выбери в выпадающем меню нужный язык)

2. 
Цитата

это пашет чётко, сенкс, значит и такое должно пахать 

Код

   long *mass;
   mass=(long*)malloc(50);               
   mass=(long*)realloc(mass,150);    
   free(mass);

Да???  

Да

3. 
Цитата

а что действительно нет, для new такого?

As far as I know smile Посмотрим, что гуру скажут наши smile 


--------------------
Помни - когда ты спишь, враг не дремлет
Спи чаще и дольше, изматывай врага бессоницей
PM MAIL ICQ   Вверх
Damarus
Дата 4.10.2006, 14:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Awaiting Authorisation
Сообщений: 671
Регистрация: 6.5.2006

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



Цитата(Syberex @  4.10.2006,  14:59 Найти цитируемый пост)
а что действительно нет, для new такого?

Нет.
PM MAIL ICQ Jabber   Вверх
Romikgy
Дата 4.10.2006, 14:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель-программер
****


Профиль
Группа: Участник Клуба
Сообщений: 7326
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

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



на одном из форумов посоветовали перейти на вектора  smile

Добавлено @ 14:35 
Цитата(Damarus @  4.10.2006,  13:24 Найти цитируемый пост)
Нет. 

в подтверждение с 
http://www.codeproject.com/tips/newandmalloc.asp
Код

No realloc alternative for new



--------------------
Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. 
smile

PM   Вверх
Oleg_Ci
Дата 26.10.2006, 15:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Friend
**


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

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



Цитата(Kuvaldis @  4.10.2006,  17:51 Найти цитируемый пост)
После оператораmass=(char*)realloc(mass,150);происходит утечка памяти, так как указатель на старые данные затирается. Здесь нужно делать так (используем промежуточный указатель)
Код

 char *mass;
 char* temp;
   mass = (char*) malloc(50);               
   temp = (char*) realloc(mass, 150);  
   if (temp != NULL)
     mass = temp;  // кстати память взяли
   free(mass);   // и тут-же её удалили...
Тогда это что ?
Код

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

int main(int argc, char *argv[] )
{
    int *a1 = (int*) malloc( 100 * sizeof(int)); // выделяем память 100  int-ов
    int *a2 = (int*) realloc( a1, 50 ); // уменьшаем размер памяти до 50
    int *a3 = (int*) realloc( a1, 200 ); // увеличиваем

    if ( a1 == a2 )    printf("a1 == a2   a1 = %d    a2 = %d\n", a1, a2); // true
    if ( a1 == a3 )    printf("a1 == a3   a1 = %d    a2 = %d", a1, a2); // true

    free( a1 );
    free( a2 ); // здесь программа вылетает...
    free( a3 );

    puts("\n\n\nPress the key of enter for the program exit");
    getchar();
    return 0;
}
Я хотел показать, что все три указателя указывают в одно и тоже место, и если хотябы "один указатель удалить"(память), то два других тоже будут удалены...(VMS2003)
Тогда память увеличивать и уменьшать так надо
Код

char *mass;
    char* temp;
    mass = (char*) malloc(50);               
    temp = (char*) realloc(mass, 150);
    if ( temp != mass && temp != NULL )
    {
        free(mass);
        mass = temp;  
    }

PM MAIL   Вверх
Kuvaldis
Дата 26.10.2006, 16:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


механик-вредитель
***


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

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



Олег4, 
То, о чем ты написал, правильно, но ты меня не понял.
Повторяю еще раз:
realloc() возвращает NULL в том случае, если память выделить не удалось.
в операторе
Код

int *a2 = (int*) realloc( a1, 50 ); // уменьшаем размер памяти до 50

как правило а2 и а1 будут указывать на одно и то же место, при условии, что изменение памяти не очень велико. Думаю ,что ты знаешь, что компилятор ищет самый подходящий кусок памяти для запроса. Т.е. наименьший из возможных. Если вдруг нам захочется выделить память большего размера, то уже выделится память в новом месте (старые данные при этом будут скопированы и старая память освобождена)
Попробуй выделить памяти побольше  smile 

2. я не совсем корректно, возможно, свой пример обработал, забыл многоточие поставить. Нужно так:
Код

 char *mass;    
 char* temp;    
   mass = (char*) malloc(50);                
   temp = (char*) realloc(mass, 150);    
   if (temp != NULL)    
      mass = temp; 
   ...                            // работа с памятью
   free(mass);  


P.S. Если на отступы смотреть, то так оно и было

СУВ

Это сообщение отредактировал(а) Kuvaldis - 26.10.2006, 16:50


--------------------
Помни - когда ты спишь, враг не дремлет
Спи чаще и дольше, изматывай врага бессоницей
PM MAIL ICQ   Вверх
MAKCim
Дата 26.10.2006, 16:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


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

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



Цитата

есть трабла на это компиль ругается

Компилятор С++? Тогда да. Другой вопрос, зачем в С++ использовать malloc?


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
Romikgy
Дата 26.10.2006, 17:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель-программер
****


Профиль
Группа: Участник Клуба
Сообщений: 7326
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

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



MAKCim, а ты начало читал?
человек спрашивал, есть ли возможность делать с new тоже что и с malloc делает realloc 


--------------------
Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. 
smile

PM   Вверх
MAKCim
Дата 26.10.2006, 17:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


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

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



Цитата

MAKCim, а ты начало читал?

не до конца  smile 
Цитата

человек спрашивал, есть ли возможность делать с new тоже что и с malloc делает realloc  

нет



--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
Gwendolen
Дата 26.10.2006, 18:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



А может стоит использовать кучи?
Код

PBYTE pbyte;
 if (<куча не создана>)
{   
    heap = HeapCreate (0, mem_sz, 0);
    pbyte = (PBYTE) HeapAlloc (heap, HEAP_ZERO_MEMORY, mem_sz); 
}
else
{
    pbyte = (PBYTE) HeapReAlloc (heap, HEAP_ZERO_MEMORY, pbyte, mem_sz); 
} 
...
HeapFree (heap, 0, pbyte);
HeapDestroy (heap);


--------------------
Наносите пользу и причиняйте добро!
PM MAIL   Вверх
Damarus
Дата 26.10.2006, 18:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Awaiting Authorisation
Сообщений: 671
Регистрация: 6.5.2006

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



Gwendolen, malloc/new и использует heap smile 
PM MAIL ICQ Jabber   Вверх
Daevaorn
Дата 26.10.2006, 18:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Как всегда в таких случаях говорят - используй std::vector
PM MAIL WWW   Вверх
Damarus
Дата 26.10.2006, 19:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Awaiting Authorisation
Сообщений: 671
Регистрация: 6.5.2006

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



Цитата(Daevaorn @  26.10.2006,  19:14 Найти цитируемый пост)
Как всегда в таких случаях говорят - используй std::vector

Именно. Хотя в данном случае может больше подойти std::string.
PM MAIL ICQ Jabber   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
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.0622 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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