IPB

Здравствуйте, гость ( Вход | Регистрация )

> Выделение динамической памяти, на С++
Nom@d
сообщение Dec 18 2006, 18:30
Сообщение #1


Пользователь
**

Группа: Posters
Сообщений: 139
Регистрация: 4.7.2006
Из: http://mobithings.ru
Пользователь №: 853



Каким образом выделить динамическую память массиву?


--------------------
Вернуться к началу страницы
 
+Цитировать сообщение
 
Создать новую тему
Ответов (1 - 12)
JoNy202
сообщение Dec 18 2006, 20:20
Сообщение #2


PAUK.NET.RU TEAM
Иконка группы

Группа: Admin
Сообщений: 1,672
Регистрация: 11.7.2005
Из: Чебоксары
Пользователь №: 1



Цитата(Nom@d @ Dec 18 2006, 19:30) *
Каким образом выделить динамическую память массиву?

ты про это чтоли

int mas = new int[10];


--------------------
Вернуться к началу страницы
 
+Цитировать сообщение
Nom@d
сообщение 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






Цитата(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
Сообщение #6


Мега постер
Иконка группы

Группа: Local moder
Сообщений: 1,712
Регистрация: 21.8.2006
Пользователь №: 1,269



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


--------------------
irc-капец

#КартинкА#
Вернуться к началу страницы
 
+Цитировать сообщение
Гость_mix_*
сообщение Aug 30 2007, 07:35
Сообщение #7





Guests






Цитата(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
Сообщение #8





Guests






Ваууу интересная тема. 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
Сообщение #9





Guests






Цитата(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
Сообщение #10


Мега постер
Иконка группы

Группа: Local moder
Сообщений: 1,712
Регистрация: 21.8.2006
Пользователь №: 1,269



Про smart pointers (в stl, boost) забыли.
mix, хочешь избегать прямой работы с памятью? Хочешь писать "безопасный код"? Пополняй ряды поклонников C#! ))

Сообщение отредактировал Amp - Aug 31 2007, 10:01


--------------------
irc-капец

#КартинкА#
Вернуться к началу страницы
 
+Цитировать сообщение
GerVin
сообщение Aug 31 2007, 11:25
Сообщение #11


Настоящий ADSL'щик
****

Группа: Posters
Сообщений: 462
Регистрация: 8.10.2005
Пользователь №: 97



Цитата(Amp @ Aug 31 2007, 10:56) *
mix, хочешь избегать прямой работы с памятью? Хочешь писать "безопасный код"? Пополняй ряды поклонников C#! ))

GC (будь то .NET или Java) действительно жутко удобная штука, и для 95% типов проектов абсолютно не критичная с точки зрения производительности, так что как гриться welcome smile.gif

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

Сообщение отредактировал GerVin - Aug 31 2007, 11:28


--------------------
We do what we must because we can
Вернуться к началу страницы
 
+Цитировать сообщение
Гость_Shweed_*
сообщение Aug 31 2007, 11:50
Сообщение #12





Guests






Слушайте ... ну чо вы как дети то? smile.gif)))) Я полностю согласен с Amp если хотите писать "безопасный код" или "управляемый" идите в C#. Там продуманный сборщик мусора и др.

Не использовать динамику? .... хмммм .... очень интересно ... вывод исползовать нада лишь по одной причине ... если хотите код сделать изящным и не требующим огромных ресурсов. Красота ...
Везде нужно искать компромис. Гдето нужна статика ... (типичный пример драйвера ... это заложено в концепции безопастности) а гдето предпочтительнее динамика (типично польхзовательские задачи ... огромные массивы ... а если надстроить то и разреженные массивы) и др.

STL ... тоже верно ... йа не поклоник правда этой библиотеки. Не было нужды. Связанные шаблонные списки и др. сам строил для конкретных задач.

И вабще йа не за malloc b realloc или new и delete. Гдето выгоднее использовать первый класс функций гдето второй. А гдето и третиый (это собственно надстройки над API (HeapAlloc, VirtualAlloc и др))
Вернуться к началу страницы
 
+Цитировать сообщение
Гость_mix_*
сообщение Aug 31 2007, 12:23
Сообщение #13





Guests






Цитата(Amp @ Aug 31 2007, 10:56) *
Про smart pointers (в stl, boost) забыли.
mix, хочешь избегать прямой работы с памятью? Хочешь писать "безопасный код"? Пополняй ряды поклонников C#! ))

Amp, избегать прямой работы с памятью не значит отказывается от нее вообще, а вот пополнить ряд поколоников C# значит. И вообще, С++ поддерживает множество парадигм и стилей программирования, выбор того или иного стиля это личное дело каждого. Но при этом практика показывает что использование (там где это возможно) безопасных контейнеров, которые не забываем являются ЧАСТЬЮ языка С++, повышает производительность труда кодировщика, а иногда даже эфективность самой программы ибо методы оптимизации, которые применялись при проектировании stl могут быть совершенно неажиданными.
Вернуться к началу страницы
 
+Цитировать сообщение

ОтветитьСоздать новую тему
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 



RSS Текстовая версия Сейчас: 28th April 2024 - 01:22