Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > изменение памяти new и malloc


Автор: Syberex 4.10.2006, 13:42
есть трабла на это компиль ругается

   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];

как?

Автор: Kuvaldis 4.10.2006, 13:51
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(). Если очень нужно, то придется самому ее написать 


Автор: Syberex 4.10.2006, 13:59
   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 такого?

Автор: Kuvaldis 4.10.2006, 14:04
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 

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

Нет.

Автор: Romikgy 4.10.2006, 14:32
на одном из форумов посоветовали перейти на вектора  smile

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

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

No realloc alternative for new

Автор: Oleg_Ci 26.10.2006, 15:49
Цитата(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;  
    }

Автор: Kuvaldis 26.10.2006, 16:04
Олег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. Если на отступы смотреть, то так оно и было

СУВ

Автор: MAKCim 26.10.2006, 16:44
Цитата

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

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

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

Автор: MAKCim 26.10.2006, 17:08
Цитата

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

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

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

нет

Автор: Gwendolen 26.10.2006, 18:03
А может стоит использовать кучи?
Код

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);


Автор: Damarus 26.10.2006, 18:09
Gwendolen, malloc/new и использует heap smile 

Автор: Daevaorn 26.10.2006, 18:14
Как всегда в таких случаях говорят - используй std::vector

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

Именно. Хотя в данном случае может больше подойти std::string.

Автор: Gwendolen 26.10.2006, 20:29
Цитата(Damarus @  26.10.2006,  18:09 Найти цитируемый пост)
wendolen, malloc/new и использует heap

Я знаю, я об этом:
Цитата(Kuvaldis @  4.10.2006,  13:51 Найти цитируемый пост)
для операторов new и delete нет аналога функции realloc()

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)