Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

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));
будет "навсегда excl.gif " утеряно?

Автор: Amp Aug 29 2007, 21:22

memcpy, strcpy, strncpy нынче не в моде )

Автор: mix Aug 30 2007, 07:35

Цитата(Amp @ Aug 29 2007, 22:22) *
memcpy, strcpy, strncpy нынче не в моде )

Честно говоря нет smile.gif . А в моде уже давно vector, string, wstring, list ну вобщем все безопасные контейнеры и методы, но если уж встала такая необходимость использовать динамическую памать, то конечно memcpy, strcpy, strncpy это хорошо, но вот использовать malloc для выделения памяти, это уж вообще, извините, вчерашний день.

Автор: Shweed Aug 30 2007, 18:32

Ваууу интересная тема. smile.gif)) Динамика .. мммм...

Такс начнем:

Для выделения небольших массивов (и даже бальших) юзать 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 все же лучше тогда когда это реально нужно (ну там лабы делать "Работа с динамической памятью" rolleyes.gif ). А так лучше вообще по возможности избегать прямой работы с памятью и пользоватся дарами 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 smile.gif

P.S.
Правильно "управляемый код" wink.gif

Автор: Shweed Aug 31 2007, 11:50

Слушайте ... ну чо вы как дети то? smile.gif)))) Я полностю согласен с 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)