Версия для печати темы
PAUK-NET.RU - Бесплатный ADSL портал Чувашии _ Прикладное программирование _ Выделение динамической памяти
Автор: Nom@d Dec 18 2006, 18:30
Каким образом выделить динамическую память массиву?
Автор: JoNy202 Dec 18 2006, 20:20
Цитата(Nom@d @ Dec 18 2006, 19:30)
Каким образом выделить динамическую память массиву?
ты про это чтоли
int mas = new int[10];
Автор: Nom@d Dec 18 2006, 20:27
Врядли надо использовать библиотеку <alloc.h>
Автор: GMaxim87 Dec 23 2006, 11:02
Прототипы ф-ий:
#include <stdlib.h>
void *malloc(size_t кол-во_байтов) /* Выделяет память */
void free(void *p) /* Освобождает память (p - указатель на участок памяти
* ранее выделенный с помощью ф-ии malloc() ) */
Пример: (толька для С, в С++ запись более простая)
/* mallok & free_23.12.2006 */
#include <stdio.h>
#include <stdlib.h>
char* mass(void);
int main(void)
{
char* ps = mass();
printf("%s",ps);
free(ps); /* Освобождение памяти */
system("pause");
return 0;
}
char* mass(void)
{
char* s = malloc(5*sizeof(char)); /* Передача s в кучу */
s = "User\n";
if(!s) {
printf("Память исчерпана!\n");
exit(1);
}
return s;
}
Автор: mix Aug 29 2007, 21:13
Цитата(GMaxim87 @ Dec 23 2006, 12:02)
char* mass(void)
{
char* s = malloc(5*sizeof(char)); /* Передача s в кучу */
s = "User\n";
if(!s) {
printf("Память исчерпана!\n");
exit(1);
}
return s;
}
Чувак, а тебе не кажется что после " s = "User\n"; " указатель s будет указывать на память где лежит "User\n", а то что сделано при помощи
char* s = malloc(5*sizeof(char));
будет "навсегда
" утеряно?
Автор: Amp Aug 29 2007, 21:22
memcpy, strcpy, strncpy нынче не в моде )
Автор: mix Aug 30 2007, 07:35
Цитата(Amp @ Aug 29 2007, 22:22)
memcpy, strcpy, strncpy нынче не в моде )
Честно говоря нет
. А в моде уже давно vector, string, wstring, list ну вобщем все безопасные контейнеры и методы, но если уж встала такая необходимость использовать динамическую памать, то конечно memcpy, strcpy, strncpy это хорошо, но вот использовать malloc для выделения памяти, это уж вообще, извините, вчерашний день.
Автор: Shweed Aug 30 2007, 18:32
Ваууу интересная тема. )) Динамика .. мммм...
Такс начнем:
Для выделения небольших массивов (и даже бальших) юзать malloc, realloc и следовательно освобождение памяти выполнять через free.
unsigned int size = 10;
char *s = (char*) malloc (size);
(Далее выполняем операции над строками!)
.....
free (s);
Минусы ... не вызывают конструкторы классов.
Если выделять память в стиле new, то очень удобно по сути вызывают конструкторы классов и др.
Минус ... нельзя перевыделить память .... (точнее довыделить).
есть одно предложение через reallloc .... но это чревато утечками памяти. Ибо эти функции включают всебя разные API функции для работы с памятью. (malloc и realloc - AllocMemory, а NEW использует HeapAlloc).
Так что вывод не пользоватсо!
А для выделения огромнеших массивов памяти лучше разабатывать свой класс для работы с динамичской памятью .. на основе VirtualAlloc. (сырцов в инете пално.)
Постом выше заметил такое ....
unsigned int size = 10;
char *s = (char*) malloc (size);
s = "строка."
ууууу неправильно! ))) ибо выделенная память потеряется. Так как s начнет указывать на другой по сути участок памяти. (будет утечка!)
PS
Аккуратно используйте динамику. Грамотно подчищайте все хвосты.
Автор: mix Aug 31 2007, 09:02
Цитата(Shweed @ Aug 30 2007, 19:32)
Для выделения небольших массивов (и даже бальших) юзать malloc, realloc и следовательно освобождение памяти выполнять через free.
Я чесно говоря не совсем понял, ты за malloc, realloc или против. Просто если уж работать в С++ (а не Си), то лучше использовать стиль программирования С++, который подрузамивает, коль уж нужна динамическая панять, используй new и delete. Но вообще использовать new и delete все же лучше тогда когда это реально нужно (ну там лабы делать "Работа с динамической памятью"
). А так лучше вообще по возможности избегать прямой работы с памятью и пользоватся дарами stl. Правда сам Б. Страуструп пишет в своей книге, мол не стоит верить чудесам, и если важна, скажем, производительность, проверить достаточно ли быстро работает stl и если достаточно то выбрать stl, иначе следует придумать более оптимальный вариант.
Цитата(Shweed @ Aug 30 2007, 19:32)
Для выделения небольших массивов (и даже бальших) юзать malloc, realloc и следовательно освобождение памяти выполнять через free.
unsigned int size = 10;
char *s = (char*) malloc (size);
(Далее выполняем операции над строками!)
.....
free (s);
Минусы ... не вызывают конструкторы классов.
Чувак, реально незнал, пасиба за инфу
Автор: Amp Aug 31 2007, 09:56
Про smart pointers (в stl, boost) забыли.
mix, хочешь избегать прямой работы с памятью? Хочешь писать "безопасный код"? Пополняй ряды поклонников C#! ))
Автор: GerVin Aug 31 2007, 11:25
Цитата(Amp @ Aug 31 2007, 10:56)
mix, хочешь избегать прямой работы с памятью? Хочешь писать "безопасный код"? Пополняй ряды поклонников C#! ))
GC (будь то .NET или Java) действительно жутко удобная штука, и для 95% типов проектов абсолютно не критичная с точки зрения производительности, так что как гриться welcome
P.S.
Правильно "управляемый код"
Автор: Shweed Aug 31 2007, 11:50
Слушайте ... ну чо вы как дети то? )))) Я полностю согласен с Amp если хотите писать "безопасный код" или "управляемый" идите в C#. Там продуманный сборщик мусора и др.
Не использовать динамику? .... хмммм .... очень интересно ... вывод исползовать нада лишь по одной причине ... если хотите код сделать изящным и не требующим огромных ресурсов. Красота ...
Везде нужно искать компромис. Гдето нужна статика ... (типичный пример драйвера ... это заложено в концепции безопастности) а гдето предпочтительнее динамика (типично польхзовательские задачи ... огромные массивы ... а если надстроить то и разреженные массивы) и др.
STL ... тоже верно ... йа не поклоник правда этой библиотеки. Не было нужды. Связанные шаблонные списки и др. сам строил для конкретных задач.
И вабще йа не за malloc b realloc или new и delete. Гдето выгоднее использовать первый класс функций гдето второй. А гдето и третиый (это собственно надстройки над API (HeapAlloc, VirtualAlloc и др))
Автор: mix Aug 31 2007, 12:23
Цитата(Amp @ Aug 31 2007, 10:56)
Про smart pointers (в stl, boost) забыли.
mix, хочешь избегать прямой работы с памятью? Хочешь писать "безопасный код"? Пополняй ряды поклонников C#! ))
Amp, избегать прямой работы с памятью не значит отказывается от нее вообще, а вот пополнить ряд поколоников C# значит. И вообще, С++ поддерживает множество парадигм и стилей программирования, выбор того или иного стиля это личное дело каждого. Но при этом практика показывает что использование (там где это возможно) безопасных контейнеров, которые не забываем являются ЧАСТЬЮ языка С++, повышает производительность труда кодировщика, а иногда даже эфективность самой программы ибо методы оптимизации, которые применялись при проектировании stl могут быть совершенно неажиданными.
Форум Invision Power Board (http://nulled.cc)
© Invision Power Services (http://nulled.cc)