Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.99/70: Рейтинг темы: голосов - 70, средняя оценка - 4.99
262 / 151 / 33
Регистрация: 29.06.2019
Сообщений: 1,515

Когда выделять память

08.10.2020, 18:18. Показов 14449. Ответов 201

Студворк — интернет-сервис помощи студентам
вот завис в моём понимании этот пункт:
Цитата Сообщение от oleg-m1973 Посмотреть сообщение
в случае динамического выделения памяти. Без которого ты вряд ли сделаешь что-то полезное.
в той же ветке - были даны пояснения
Цитата Сообщение от oleg-m1973 Посмотреть сообщение
В стеке ты не можешь свободно создавать/удалять объекты. Только добавлять в голову и удалять оттуда же. В куче же ты можешь это делать в любой последовательности.
...
когда выделять поток - в принципе поняла,
когда выделять класс - в принципе поняла (чтобы разорвать зависимости)
КОГДА выделять память?.. - всё-таки ещё не всегда очень хочется её выделять, чтобы потом удалять... но даже не в этом суть... а смысл первой цитаты?
поделитесь please опытом кто-нибудь - когда вы выбираете создать объект на стеке, а когда вы выбираете создать объект в куче?. - какие есть предпосылки для вашего выбора?
не хочу потом всё переделывать - а мне всё равно кажется, что на стеке всегда быстрее, а когда и почему лучше куча не знаю... а то ведь могу написать что попало...
логично, что на стеке - определена последрвательность, но ведь при обращении к разным объектам проблем вроде не бывает... имхо... и понятно, что через стек идут параметры функций - так что получается, всё остальное, т.е. вообще всё лучше располагать в куче?
какую проблему можно получить, если всё располагать на стеке? и в каком случае вообще app не запуститься при таком подходе (есть ли такая опасность)?.. есть ли какие-то критерии "must do"? и никак иначе
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
08.10.2020, 18:18
Ответы с готовыми решениями:

Как лучше выделять память: динамичски или в стэке?
Я раньше всегда думал, что в стеке происходит более быстрое выделение, но сейчас нашел в интернете одну статью, где было написано: ...

Можно ли через список инициализации выделять память в куче
Можно через список инициализации выделять память в куче?

Как динамически выделять память на один элемент массива?
Вот программа: int main() { int n,a,b; Item *mas; cout << "Enter amount of coordinates" << endl; cin >>...

201
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
08.10.2020, 18:27
Лучший ответ Сообщение было отмечено JeyCi как решение

Решение

Цитата Сообщение от JeyCi Посмотреть сообщение
когда вы выбираете создать объект на стеке, а когда вы выбираете создать объект в куче?. - какие есть предпосылки для вашего выбора?
не хочу потом всё переделывать - а мне всё равно кажется, что на стеке всегда быстрее, а когда и почему лучше куча не знаю... а то ведь могу написать что попало...
Объект на стеке будет удалён сразу при выходе из области видимости. Если тебе нужны более долгоживущие объекты, выделяешь их на куче.

Добавлено через 1 минуту
Размер стека ограничен, т.е. большие объекты/массивы лучше выделять на куче
1
 Аватар для fedorov21951
111 / 81 / 34
Регистрация: 18.06.2020
Сообщений: 430
08.10.2020, 18:32
JeyCi,
при выходе из функции память в стеке освобождается. Все локальные переменные хранятся в стеке.
например:
C++
1
2
int a = 5;
return &a;
Такой код вызовет ошибку времени исполнения - при выходе из метода память под переменную a будет удалена, а ссылка будет указывать на мусор.
Поэтому для этого надо выделять память, а потом удалять ее
1
Почетный модератор
7393 / 2639 / 281
Регистрация: 29.07.2006
Сообщений: 13,696
08.10.2020, 18:53
Цитата Сообщение от fedorov21951 Посмотреть сообщение
при выходе из функции память в стеке освобождается.
Чем? Она была выделена?
Цитата Сообщение от fedorov21951 Посмотреть сообщение
Такой код вызовет ошибку времени исполнения
Такой код точно никакой ошибки из-за стека и локальных переменных не вызовет. Если и вызовет, то не из-за того, что что-то "освобождается" в стеке (по факту, ничего), а только, если компилятор, видя, что мы возвращаем адрес локальной переменнуой, нулем его заменит. Тогда - да. Только это не из-за стека, а из-за замены адреса на 0.
Стек как был, так и остался на месте, доступный нам, не важно вышли мы из функции, или нет:
C++
1
2
3
4
5
6
7
8
9
10
11
int* func()
{
    int a = 10;
    int *p = &a;
    return p;
}
 
int main()
{
    *(func()) = 10;
}
Code
1
Program returned: 0
2
262 / 151 / 33
Регистрация: 29.06.2019
Сообщений: 1,515
08.10.2020, 19:26  [ТС]
Цитата Сообщение от fedorov21951 Посмотреть сообщение
при выходе из метода память под переменную a будет удалена, а ссылка будет указывать на мусор. Поэтому для этого надо выделять память, а потом удалять ее
этот пример вероятно про то, что вы имели ввиду - dangling reference
- я поэтому и не хочу связываться со всеми new - потому что даже при выходе из scope непонятно, что потеряю... (ведь приходится иногда уж достаточно сильно закручивать код логически, да ещё всякие Exceptions можно словить - не норм. выходы бывают)...
поэтому интересуюсь, когда же всё-таки БЕЗ new/delete никак не прожить... всегда старалась их избегать - но настало, наверно, время - расширять свой арсенал... - чтобы в полную силу реализовывать с++, а в чём сила использования кучи - не знаю...?

Добавлено через 4 минуты
Цитата Сообщение от oleg-m1973 Посмотреть сообщение
Объект на стеке будет удалён сразу при выходе из области видимости. Если тебе нужны более долгоживущие объекты, выделяешь их на куче.
вот об этом ещё не думала... спасибо!

Добавлено через 1 минуту
Цитата Сообщение от oleg-m1973 Посмотреть сообщение
большие объекты/массивы лучше выделять на куче
- да, это помню
0
 Аватар для fedorov21951
111 / 81 / 34
Регистрация: 18.06.2020
Сообщений: 430
08.10.2020, 20:08
Цитата Сообщение от JeyCi Посмотреть сообщение
я поэтому и не хочу связываться со всеми new - потому что даже при выходе из scope непонятно, что потеряю...
можно использовать smart pointers unique_ptr shared_ptr и weak_pr
1
Эксперт С++
 Аватар для Avazart
8484 / 6151 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
08.10.2020, 20:49
Цитата Сообщение от JeyCi Посмотреть сообщение
а в чём сила использования кучи - не знаю...?
Наверное в том что можно больше объема выделить(чем на стеке)?
Можно его вернуть когда не надо. Да и главное можно выделить ровно столько сколько нужно на данный момент времени.

Добавлено через 2 минуты
Цитата Сообщение от JeyCi Посмотреть сообщение
поэтому интересуюсь, когда же всё-таки БЕЗ new/delete никак не прожить
Там где нужна полиморфность ?
Например приложение с Qt будет содержать обязательно new
1
377 / 228 / 79
Регистрация: 24.11.2009
Сообщений: 695
08.10.2020, 21:53
Цитата Сообщение от oleg-m1973 Посмотреть сообщение
Объект на стеке будет удалён сразу при выходе из области видимости
static не будет. и смотри код ниже.
Цитата Сообщение от fedorov21951 Посмотреть сообщение
int a = 5;
return &a;
А если так:

C++
1
2
3
4
5
string foo(){ 
return "olololo"; // <-- временный объект.
}
const string& not_garbige = foo();
cout << not_garbige << endl;
Цитата Сообщение от Avazart Посмотреть сообщение
Наверное в том что можно больше объема выделить(чем на стеке)?
C++
1
#pragma comment(linker, "/STACK: SIZE_IN_BYTES")
Цитата Сообщение от JeyCi Посмотреть сообщение
что на стеке всегда быстрее,
25 тактов вместо 10? Забейте на это.
0
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
08.10.2020, 22:02
Цитата Сообщение от Vladimir. Посмотреть сообщение
static не будет. и смотри код ниже.
static не на стеке выделяется. И что там ниже я должен увидеть?

Цитата Сообщение от Vladimir. Посмотреть сообщение
25 тактов вместо 10? Забейте на это.
Это ты об чём вообще, какие 25 тактов?
0
Эксперт С++
 Аватар для Avazart
8484 / 6151 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
08.10.2020, 22:34
Цитата Сообщение от Vladimir. Посмотреть сообщение
25 тактов вместо 10? Забейте на это.
Если посчитать то в 2.5 раза ? Или у Вас другая арифметика?

Добавлено через 12 минут
И да на стеке быстрее, с этим нельзя не считаться, даже если не используешь new/delete явно.
Именно по этому стоит делать у вектора reserve перед тем как добавлять элементы если кол-во элементов можно предсказать.
0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9005 / 4706 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
08.10.2020, 22:41
JeyCi, бываает не только полиморфизма для, нужен указатель на кучу. Бывает (по разным причинам, не только singleton) нужно закрыть конструкторы, а создание объектов делегировать фабрике или фабричному классу. Эти друзья (они и вправду друзья) могут выделить память в куче и разместить там placement new объект и вернуть указатель. Указатель может быть и мудрым в том числе.
0
377 / 228 / 79
Регистрация: 24.11.2009
Сообщений: 695
08.10.2020, 22:47
Цитата Сообщение от oleg-m1973 Посмотреть сообщение
И что там ниже я должен увидеть?
что созданная автоматически переменная продолжает жить за пределами скоупа функции при присваивании константной ссылке.
Цитата Сообщение от Avazart Посмотреть сообщение
Если посчитать то в 2.5 раза ? Или у Вас другая арифметика?
Не тот уровень задач, когда это имеет значение. К тому же можно делать ленивые вычисления или выделять память блоками под несколько объектов, если их количество большое. Я не оспариваю аргумент, а утверждаю, что его значимость в данном случае невелика.
0
Эксперт С++
 Аватар для Avazart
8484 / 6151 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
08.10.2020, 22:51
Цитата Сообщение от Vladimir. Посмотреть сообщение
что созданная автоматически переменная продолжает жить за пределами скоупа функции при присваивании константной ссылке.
Заблуждение.

Добавлено через 56 секунд
Цитата Сообщение от Vladimir. Посмотреть сообщение
Не тот уровень задач, когда это имеет значение. К тому же можно делать ленивые вычисления или выделять память блоками под несколько объектов, если их количество большое. Я не оспариваю аргумент, а утверждаю, что его значимость в данном случае невелика.
Я не понимаю что Вы тогда утверждаете.
Если можно создать на стеке стоит создавать на стеке для этого кажется есть даже специальные контейнеры. Если же нет - то нет.
О какой значимости Вы говорите не понятно.
0
377 / 228 / 79
Регистрация: 24.11.2009
Сообщений: 695
09.10.2020, 00:56
Avazart,
Заблуждение.
Возможно. Тем не менее, потратьте 10 минут на изучение вопроса.
Цитата Сообщение от oleg-m1973 Посмотреть сообщение
static не на стеке выделяется.
А где тогда?
Цитата Сообщение от Avazart Посмотреть сообщение
О какой значимости Вы говорите не понятно.
У нас получилось "долларовое обсуждение для идеи на четвертак". Я говорю, что делать нужно как удобнее, а не как быстрее.

это всё с пониманием, что для меня плюсы лишь вспомогательный в работе инструмент - стандарт и GotW от корки до корки не штудировал.
0
Эксперт С++
 Аватар для Avazart
8484 / 6151 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
09.10.2020, 01:36
Цитата Сообщение от Vladimir. Посмотреть сообщение
А где тогда?
В процессе есть специальная область данных для них.
Но тут важнее не где именно, а какой тип storage duration.
И что так стоит возвращать только константные "сущности" иначе могут быть проблемы при вызове из нескольких потоков.

Добавлено через 1 минуту
Цитата Сообщение от Vladimir. Посмотреть сообщение
У нас получилось "долларовое обсуждение для идеи на четвертак". Я говорю, что делать нужно как удобнее, а не как быстрее.
Удобно это субъективное слово. Делать нужно как требует та или иная ситуация.
0
262 / 151 / 33
Регистрация: 29.06.2019
Сообщений: 1,515
09.10.2020, 08:15  [ТС]
Цитата Сообщение от Vladimir. Посмотреть сообщение
К тому же можно делать ленивые вычисления
ну это уж точно быстрее не сделает программу - я вообще их смысл не совсем понимаю, как по мне, так раз просчитал и потом пользуйся результатом, чем каждый раз по месту выполнять их - везде, где встречаются... смысл?..
Цитата Сообщение от Vladimir. Посмотреть сообщение
делать нужно как удобнее, а не как быстрее.
спорно - всегда нужен баланс между скоростью и удобством и чем-то приходится жертвовать ради другого...
Цитата Сообщение от oleg-m1973 Посмотреть сообщение
static не на стеке выделяется
вроде global на стеке выделяется... и когда exception или просто выход из app, то он вроде и не unwind - так и возникают memory leaks, если не ошибаюсь...
ну или так - в случае неудаления объекта:
C++
1
2
3
4
5
6
7
8
9
10
11
12
struct Foo {
   byte *ptr;
 
   //~Foo() { if(ptr) delete[] ptr; } // this might be missing
   ~Foo() {}
};
 
Foo foo;
 
CONSOLE_APP_MAIN {
   foo.ptr = new byte[1000];
}
а при закомментированном деструкторе - норм.
а вообще - спасибо за дискуссию

Добавлено через 5 минут
Цитата Сообщение от IGPIGP Посмотреть сообщение
а создание объектов делегировать фабрике или фабричному классу.
выгоду этого варианта тоже пока не могу увидеть - код - когда мне это выгоднее, чем просто создать инстанс класса?... (хотя по линку описано)
? ну и разве что - счётчик ссылок зарядить на фабрике ? (если надо) - пока для себя не вижу др причин использования... имхо

Добавлено через 2 минуты
Цитата Сообщение от IGPIGP Посмотреть сообщение
не только singleton
ну этот в U++ уже вроде под капотом
One is a container capable of containing none or single element of type specified as template argument or derived from it.
0
Любитель чаепитий
 Аватар для GbaLog-
3745 / 1801 / 566
Регистрация: 24.08.2014
Сообщений: 6,020
Записей в блоге: 1
09.10.2020, 08:18
Цитата Сообщение от Avazart Посмотреть сообщение
И да на стеке быстрее, с этим нельзя не считаться, даже если не используешь new/delete явно.
Именно по этому стоит делать у вектора reserve перед тем как добавлять элементы если кол-во элементов можно предсказать.
вот оно что, а я-то дурак думал, что это чтобы реаллокаций меньше было.
а можете мне, криворукому, пояснить, что делает reserve со стеком?
0
262 / 151 / 33
Регистрация: 29.06.2019
Сообщений: 1,515
09.10.2020, 08:58  [ТС]
6 Tips to supercharge C++11 vector performance
Цитата Сообщение от GbaLog- Посмотреть сообщение
#1 Avoid unnecessary reallocate and copy cycles by reserving the size of vector ahead of time.That’s a performance gain of 75.14% !!!
Добавлено через 5 минут
я по Деструктору вектора обычно - полагаю, что такой вариант самый правильный (сначала clear, потом swap)...
по Конструктору - сразу резервировать с запасом - чтобы не увеличивать каждый раз... при необходимости - увеличивать сразу на N элементов - очевидно ведь, что будет быстрее, чем увеличить N раз по одной штуке...
Цитата Сообщение от Tulosba Посмотреть сообщение
reserve изменяет ёмкость, а resize - размер.
...
0
19491 / 10097 / 2460
Регистрация: 30.01.2014
Сообщений: 17,805
09.10.2020, 09:15
Цитата Сообщение от JeyCi Посмотреть сообщение
вроде global на стеке выделяется... и когда exception или просто выход из app, то он вроде и не unwind - так и возникают memory leaks, если не ошибаюсь...
ну или так - в случае неудаления объекта:
C++
1
2
3
4
5
6
7
8
9
10
11
12
struct Foo {
   byte *ptr;
 
   //~Foo() { if(ptr) delete[] ptr; } // this might be missing
   ~Foo() {}
};
 
Foo foo;
 
CONSOLE_APP_MAIN {
   foo.ptr = new byte[1000];
}
а при закомментированном деструкторе - норм.
https://en.cppreference.com/w/... e_duration
0
262 / 151 / 33
Регистрация: 29.06.2019
Сообщений: 1,515
09.10.2020, 10:04  [ТС]
Цитата Сообщение от DrOffset Посмотреть сообщение
https://en.cppreference.com/w/... e_duration
по Static local variables почитаю - спасибо...
***
Три вида утечек памяти
? полагаю, по линку cppreference - это Тип (2): незапланированно долгоживущие выделения памяти ?
Кликните здесь для просмотра всего текста
Как определить, что утечка относится именно к этой категории

Если программа выполняется в среде со сборкой мусора, то именно этот вариант рассматриваем в первую очередь.
Сравните размер кучи, выводимый в статистике сборщика мусора, с размером свободной памяти, выдаваемым операционной системой. Если утечка относится к этой категории, то цифры будут сравнимы и, что особенно важно, с течением времени будут следовать друг за другом.

мой же пример - это, вероятно, Тип(1) - "Кто-то выделил память при помощи new или malloc, и так и не вызвал free или delete, чтобы высвободить память по окончании работы с ней." - т.е. при раскомментированном том, что в моём примере закомментировано - будет норм
p.s.
Тип (3): свободная, но неиспользуемая или непригодная для использования память
- это, похоже, тот же свободный хвост после vector reserve - если его не занять чем-нибудь или не shrink_to_fit
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
09.10.2020, 10:04
Помогаю со студенческими работами здесь

Подскажите пожалуйста, правильно выделять память под lua состояние
Подскажите пожалуйста, правильно выделять память под lua состояние. Выполнение кода не возвращает 0. Сам код не мой, его ...

Нужно ли под массив выделять память функциями malloc или new?
собственно вот программа по вводу размера массива, вводу массива, сортировки: #include &lt;iostream&gt; #include &lt;windows.h&gt; ...

Можно ли, используя make_shared<T> выделять память под массивы, по аналогии с функцией make_unique<T>?
Интересует следующий вопрос. Можно ли, используя данную функцию выделять память под массивы, по аналогии с функцией make_unique&lt;T&gt;....

Функция: подсчет количества слов во введенной строке (под строку выделять динамическую память)
Доброго времени суток! Осваиваю С++, возникла проблема с написанием программы. По заданию необходимо написать функцию, подсчитывающую...

Можно ли выделять память под объект класса с помощью функций calloc, malloc или realloc?
Интересует данный вопрос. Можно ли и имеет ли вобще смысл например выделять память под объект класса с помощью функций calloc, malloc или...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка. Рецензия / Мнение Это мой обзор планшета X220 с точки зрения школьника. Недавно я решила попытаться уменьшить свой. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru