![]() |
Здравствуйте, гость ( Вход | Регистрация )
![]() |
![]()
Сообщение
#1
|
|
![]() Пользователь ![]() ![]() Группа: Posters Сообщений: 139 Регистрация: 4.7.2006 Из: http://mobithings.ru Пользователь №: 853 ![]() |
Каким образом выделить динамическую память массиву?
-------------------- |
|
|
![]() |
![]()
Сообщение
#2
|
|
PAUK.NET.RU TEAM ![]() Группа: Admin Сообщений: 1,672 Регистрация: 11.7.2005 Из: Чебоксары Пользователь №: 1 ![]() |
Каким образом выделить динамическую память массиву? ты про это чтоли int mas = new int[10]; -------------------- |
|
|
![]()
Сообщение
#3
|
|
![]() Пользователь ![]() ![]() Группа: Posters Сообщений: 139 Регистрация: 4.7.2006 Из: http://mobithings.ru Пользователь №: 853 ![]() |
Врядли надо использовать библиотеку <alloc.h>
-------------------- |
|
|
Гость_GMaxim87_* |
![]()
Сообщение
#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_* |
![]() ![]()
Сообщение
#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)); будет "навсегда ![]() |
|
|
![]()
Сообщение
#6
|
|
![]() Мега постер ![]() Группа: Local moder Сообщений: 1,712 Регистрация: 21.8.2006 Пользователь №: 1,269 ![]() |
memcpy, strcpy, strncpy нынче не в моде )
-------------------- |
|
|
Гость_mix_* |
![]()
Сообщение
#7
|
Guests ![]() |
memcpy, strcpy, strncpy нынче не в моде ) Честно говоря нет ![]() |
|
|
Гость_Shweed_* |
![]()
Сообщение
#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_* |
![]()
Сообщение
#9
|
Guests ![]() |
Для выделения небольших массивов (и даже бальших) юзать malloc, realloc и следовательно освобождение памяти выполнять через free. Я чесно говоря не совсем понял, ты за malloc, realloc или против. Просто если уж работать в С++ (а не Си), то лучше использовать стиль программирования С++, который подрузамивает, коль уж нужна динамическая панять, используй new и delete. Но вообще использовать new и delete все же лучше тогда когда это реально нужно (ну там лабы делать "Работа с динамической памятью" ![]() Для выделения небольших массивов (и даже бальших) юзать malloc, realloc и следовательно освобождение памяти выполнять через free. unsigned int size = 10; char *s = (char*) malloc (size); (Далее выполняем операции над строками!) ..... free (s); Минусы ... не вызывают конструкторы классов. Чувак, реально незнал, пасиба за инфу |
|
|
![]()
Сообщение
#10
|
|
![]() Мега постер ![]() Группа: Local moder Сообщений: 1,712 Регистрация: 21.8.2006 Пользователь №: 1,269 ![]() |
Про smart pointers (в stl, boost) забыли.
mix, хочешь избегать прямой работы с памятью? Хочешь писать "безопасный код"? Пополняй ряды поклонников C#! )) Сообщение отредактировал Amp - Aug 31 2007, 10:01 -------------------- |
|
|
![]()
Сообщение
#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_* |
![]()
Сообщение
#12
|
Guests ![]() |
Слушайте ... ну чо вы как дети то?
![]() Не использовать динамику? .... хмммм .... очень интересно ... вывод исползовать нада лишь по одной причине ... если хотите код сделать изящным и не требующим огромных ресурсов. Красота ... Везде нужно искать компромис. Гдето нужна статика ... (типичный пример драйвера ... это заложено в концепции безопастности) а гдето предпочтительнее динамика (типично польхзовательские задачи ... огромные массивы ... а если надстроить то и разреженные массивы) и др. STL ... тоже верно ... йа не поклоник правда этой библиотеки. Не было нужды. Связанные шаблонные списки и др. сам строил для конкретных задач. И вабще йа не за malloc b realloc или new и delete. Гдето выгоднее использовать первый класс функций гдето второй. А гдето и третиый (это собственно надстройки над API (HeapAlloc, VirtualAlloc и др)) |
|
|
Гость_mix_* |
![]()
Сообщение
#13
|
Guests ![]() |
Про smart pointers (в stl, boost) забыли. mix, хочешь избегать прямой работы с памятью? Хочешь писать "безопасный код"? Пополняй ряды поклонников C#! )) Amp, избегать прямой работы с памятью не значит отказывается от нее вообще, а вот пополнить ряд поколоников C# значит. И вообще, С++ поддерживает множество парадигм и стилей программирования, выбор того или иного стиля это личное дело каждого. Но при этом практика показывает что использование (там где это возможно) безопасных контейнеров, которые не забываем являются ЧАСТЬЮ языка С++, повышает производительность труда кодировщика, а иногда даже эфективность самой программы ибо методы оптимизации, которые применялись при проектировании stl могут быть совершенно неажиданными. |
|
|
![]() ![]() |
![]() |
Текстовая версия | Сейчас: 4th July 2025 - 02:11 |