5 / 5 / 2
Регистрация: 10.06.2014
Сообщений: 40
1

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

29.05.2015, 18:33. Показов 1521. Ответов 6
Метки нет (Все метки)

Всем здрасьте.
C++
1
2
3
4
//1
char s = 's';
//2
char* ss = new char[25];
Во втором случае компилятор выделяет участок памяти, потом мне же её надо будет удалить с помощью delete[].
А что на счёт первого ? В этом случае тоже выделяется память, но освобождается она только после закрытия программы ? В чом тогда прикол самому выделять память ?
Где и какой из случаев лучше использовать ? Подскажите c:
__________________
Помощь в написании контрольных, курсовых и дипломных работ здесь
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
29.05.2015, 18:33
Ответы с готовыми решениями:

Если для структуры используется оператор new, то память выделяется в куче или на стеке?
Если для структуры используется оператор new, например, так: struct SomeStruct { }

Когда выделяется память под переменные - во время объявления или инициализации
Привет! Вопрос такой: когда выделяется память под переменные - во время объявления или...

Как происходит процесс выделения памяти в стеке и куче
#include <stdio.h> #include <conio.h> #include <windows.h> #include "disc.h" void main() { ...

Создание массивов в стеке и куче
"Напишите небольшую программу,которая создаёт массивы в стеке(массивы фиксированного размера) и...

6
76 / 76 / 32
Регистрация: 14.04.2014
Сообщений: 408
29.05.2015, 18:34 2
книжки в помощь.
0
33 / 33 / 36
Регистрация: 22.05.2015
Сообщений: 146
29.05.2015, 18:52 3
Лучший ответ Сообщение было отмечено noop как решение

Решение

Ну в первом случае Вы инициализируете переменную типа Char, объёмом 1 байт.
В этом случае память освобождается, когда программа выходит за область видимости, в которой объявлена переменная.

А во втором, как Вы и говорили, участок памяти для 25 переменных типа Char. Объём этого участка 25 байт и он будет виден во всех областях видимости, по-этому и требует ручной очистки во избежание утечек памяти.
1
5 / 5 / 2
Регистрация: 10.06.2014
Сообщений: 40
29.05.2015, 18:55  [ТС] 4
awalio, Спасиб с:
А если это переменная содержится в классе, то и освободится при освобождении класса ? Это тоже же как область видимости - класс ?
0
33 / 33 / 36
Регистрация: 22.05.2015
Сообщений: 146
29.05.2015, 18:57 5
noop, да, область видимости в С++ ограничивается скобочками { }.
0
5 / 5 / 2
Регистрация: 10.06.2014
Сообщений: 40
29.05.2015, 19:03  [ТС] 6
Спасибо огромное с:
0
25 / 11 / 5
Регистрация: 11.01.2014
Сообщений: 85
29.05.2015, 19:05 7
Всё очень просто, это тоже самое как машина: есть механика, а есть автомат. Когда ты пишешь
C++
1
char c;
компилятор за тебя сам выделяет память, сам запоминает адрес, сам удаляет память.
А если ты пишешь
C++
1
char* c = new char[25];
компилятор даёт тебе свободу действий. Потому что ты можешь выделить себе новую память, а можешь перейти к уже существующей, даже той, которая находится в другой программе. Ты можешь удалить любой участок памяти. Или прочитать тип int, как char. Также ты можешь не удалять ничего и забить память. Ты свободен в своих действиях.

Использовать лучше статическую память, если это переменная. Если массив, который может постоянно меняться, то используй динамическую память.

Добавлено через 46 секунд
Причём, никто не мешает создать динамическую переменную.
C++
1
char* c = new char;
1
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
29.05.2015, 19:05

Расположение данных в стеке и в куче
Друзья, возник вопрос. Следующий код char length_buffer; ...заполнение length_buffer двоичным...

Создание QApplication на стеке или в куче
Только начал разбираться с QT и появилось неск. глупых вопросов: - Какая разница между ...

Интерфейс хранится в стеке или в куче?
интерфейс хранится в стеке или в куче?

Несколько моментов про хранение в куче и в стеке
Хотел уточнить несколько моментов про хранение в куче и в стеке: 1) Ссылочные типы всегда...


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

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.