| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > 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, нужно так
Но так, как ты сделал, плохо. Во-первых, нет проверки на выделение. Во-вторых, при использовании realloc() есть один неприятный подводный камень. данная функция возвращает NULL, если память выделить не удалось. Предположим, что для указателя mass память выделилась и в ней сидят данные. После оператора mass=(char*)realloc(mass,150); происходит утечка памяти, так как указатель на старые данные затирается. Здесь нужно делать так (используем промежуточный указатель)
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.
Да 3.
As far as I know |
| Автор: Damarus 4.10.2006, 14:24 |
Нет. |
| Автор: Romikgy 4.10.2006, 14:32 | ||
| на одном из форумов посоветовали перейти на вектора Добавлено @ 14:35 в подтверждение с http://www.codeproject.com/tips/newandmalloc.asp
|
| Автор: Kuvaldis 26.10.2006, 16:04 | ||||
| Олег4, То, о чем ты написал, правильно, но ты меня не понял. Повторяю еще раз: realloc() возвращает NULL в том случае, если память выделить не удалось. в операторе
как правило а2 и а1 будут указывать на одно и то же место, при условии, что изменение памяти не очень велико. Думаю ,что ты знаешь, что компилятор ищет самый подходящий кусок памяти для запроса. Т.е. наименьший из возможных. Если вдруг нам захочется выделить память большего размера, то уже выделится память в новом месте (старые данные при этом будут скопированы и старая память освобождена) Попробуй выделить памяти побольше 2. я не совсем корректно, возможно, свой пример обработал, забыл многоточие поставить. Нужно так:
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 | ||||
не до конца
нет |
| Автор: Gwendolen 26.10.2006, 18:03 | ||
А может стоит использовать кучи?
|
| Автор: Damarus 26.10.2006, 18:09 |
| Gwendolen, malloc/new и использует heap |
| Автор: Daevaorn 26.10.2006, 18:14 |
| Как всегда в таких случаях говорят - используй std::vector |
| Автор: Damarus 26.10.2006, 19:54 |
Именно. Хотя в данном случае может больше подойти std::string. |
| Автор: Gwendolen 26.10.2006, 20:29 |
Я знаю, я об этом: |