Выделение динамической памяти, на С++ |
Здравствуйте, гость ( Вход | Регистрация )
Выделение динамической памяти, на С++ |
Dec 18 2006, 18:30
Сообщение
#1
|
|
Пользователь Группа: Posters Сообщений: 139 Регистрация: 4.7.2006 Из: http://mobithings.ru Пользователь №: 853 |
Каким образом выделить динамическую память массиву?
-------------------- |
|
|
Dec 18 2006, 20:20
Сообщение
#2
|
|
PAUK.NET.RU TEAM Группа: Admin Сообщений: 1,672 Регистрация: 11.7.2005 Из: Чебоксары Пользователь №: 1 |
Каким образом выделить динамическую память массиву? ты про это чтоли int mas = new int[10]; -------------------- |
|
|
Dec 18 2006, 20:27
Сообщение
#3
|
|
Пользователь Группа: Posters Сообщений: 139 Регистрация: 4.7.2006 Из: http://mobithings.ru Пользователь №: 853 |
Врядли надо использовать библиотеку <alloc.h>
-------------------- |
|
|
Гость_GMaxim87_* |
Dec 23 2006, 11:02
Сообщение
#4
|
Guests |
Прототипы ф-ий:
#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
Сообщение
#5
|
Guests |
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)); будет "навсегда " утеряно? |
|
|
Aug 29 2007, 21:22
Сообщение
#6
|
|
Мега постер Группа: Local moder Сообщений: 1,712 Регистрация: 21.8.2006 Пользователь №: 1,269 |
memcpy, strcpy, strncpy нынче не в моде )
-------------------- |
|
|
Гость_mix_* |
Aug 30 2007, 07:35
Сообщение
#7
|
Guests |
memcpy, strcpy, strncpy нынче не в моде ) Честно говоря нет . А в моде уже давно vector, string, wstring, list ну вобщем все безопасные контейнеры и методы, но если уж встала такая необходимость использовать динамическую памать, то конечно memcpy, strcpy, strncpy это хорошо, но вот использовать malloc для выделения памяти, это уж вообще, извините, вчерашний день. |
|
|
Гость_Shweed_* |
Aug 30 2007, 18:32
Сообщение
#8
|
Guests |
Ваууу интересная тема. )) Динамика .. мммм...
Такс начнем: Для выделения небольших массивов (и даже бальших) юзать 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
Сообщение
#9
|
Guests |
Для выделения небольших массивов (и даже бальших) юзать malloc, realloc и следовательно освобождение памяти выполнять через free. Я чесно говоря не совсем понял, ты за malloc, realloc или против. Просто если уж работать в С++ (а не Си), то лучше использовать стиль программирования С++, который подрузамивает, коль уж нужна динамическая панять, используй new и delete. Но вообще использовать new и delete все же лучше тогда когда это реально нужно (ну там лабы делать "Работа с динамической памятью" ). А так лучше вообще по возможности избегать прямой работы с памятью и пользоватся дарами stl. Правда сам Б. Страуструп пишет в своей книге, мол не стоит верить чудесам, и если важна, скажем, производительность, проверить достаточно ли быстро работает stl и если достаточно то выбрать stl, иначе следует придумать более оптимальный вариант. Для выделения небольших массивов (и даже бальших) юзать malloc, realloc и следовательно освобождение памяти выполнять через free. unsigned int size = 10; char *s = (char*) malloc (size); (Далее выполняем операции над строками!) ..... free (s); Минусы ... не вызывают конструкторы классов. Чувак, реально незнал, пасиба за инфу |
|
|
Aug 31 2007, 09:56
Сообщение
#10
|
|
Мега постер Группа: Local moder Сообщений: 1,712 Регистрация: 21.8.2006 Пользователь №: 1,269 |
Про smart pointers (в stl, boost) забыли.
mix, хочешь избегать прямой работы с памятью? Хочешь писать "безопасный код"? Пополняй ряды поклонников C#! )) Сообщение отредактировал Amp - Aug 31 2007, 10:01 -------------------- |
|
|
Aug 31 2007, 11:25
Сообщение
#11
|
|
Настоящий ADSL'щик Группа: Posters Сообщений: 462 Регистрация: 8.10.2005 Пользователь №: 97 |
mix, хочешь избегать прямой работы с памятью? Хочешь писать "безопасный код"? Пополняй ряды поклонников C#! )) GC (будь то .NET или Java) действительно жутко удобная штука, и для 95% типов проектов абсолютно не критичная с точки зрения производительности, так что как гриться welcome P.S. Правильно "управляемый код" Сообщение отредактировал GerVin - Aug 31 2007, 11:28 -------------------- We do what we must because we can
|
|
|
Гость_Shweed_* |
Aug 31 2007, 11:50
Сообщение
#12
|
Guests |
Слушайте ... ну чо вы как дети то? )))) Я полностю согласен с Amp если хотите писать "безопасный код" или "управляемый" идите в C#. Там продуманный сборщик мусора и др.
Не использовать динамику? .... хмммм .... очень интересно ... вывод исползовать нада лишь по одной причине ... если хотите код сделать изящным и не требующим огромных ресурсов. Красота ... Везде нужно искать компромис. Гдето нужна статика ... (типичный пример драйвера ... это заложено в концепции безопастности) а гдето предпочтительнее динамика (типично польхзовательские задачи ... огромные массивы ... а если надстроить то и разреженные массивы) и др. STL ... тоже верно ... йа не поклоник правда этой библиотеки. Не было нужды. Связанные шаблонные списки и др. сам строил для конкретных задач. И вабще йа не за malloc b realloc или new и delete. Гдето выгоднее использовать первый класс функций гдето второй. А гдето и третиый (это собственно надстройки над API (HeapAlloc, VirtualAlloc и др)) |
|
|
Гость_mix_* |
Aug 31 2007, 12:23
Сообщение
#13
|
Guests |
Про smart pointers (в stl, boost) забыли. mix, хочешь избегать прямой работы с памятью? Хочешь писать "безопасный код"? Пополняй ряды поклонников C#! )) Amp, избегать прямой работы с памятью не значит отказывается от нее вообще, а вот пополнить ряд поколоников C# значит. И вообще, С++ поддерживает множество парадигм и стилей программирования, выбор того или иного стиля это личное дело каждого. Но при этом практика показывает что использование (там где это возможно) безопасных контейнеров, которые не забываем являются ЧАСТЬЮ языка С++, повышает производительность труда кодировщика, а иногда даже эфективность самой программы ибо методы оптимизации, которые применялись при проектировании stl могут быть совершенно неажиданными. |
|
|
Текстовая версия | Сейчас: 4th May 2024 - 14:48 |