Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.80/5: Рейтинг темы: голосов - 5, средняя оценка - 4.80
0 / 0 / 0
Регистрация: 25.02.2015
Сообщений: 2
1

Правила размещения объектов в памяти

25.02.2015, 16:18. Показов 875. Ответов 5
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Привет всем! Подскажите пожалуйста, искал по форуму поиском ответ, но не нашел.
Имеем такой код:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
class A{
  public
    A();
    ~A();
    int i;
    int j;  
}
 
class B{
  public 
    B();
   ~B();
    int x;
    int y;
   void exchange(void);
    
}
 
B::B(){
  A a();
  a.i=7;
}
 
B::exchange(){
   int s;
 
   s=x;
   y=s;
}
 
int main(){
  
  B *b = new B();
 
  delete(b);
  return 0
}
указатель на объект типа B разместится в стеке, сам объект в куче, а вот где разместится объект А созданный внутри объекта B, в стеке или в куче внутри объекта B?

Переменная s метода exchange будет создана в стеке и разрушится автоматически при выходе из метода?

Обязательно ли при выходе освобождать память занятую объектом b, ведь при завершении процесса ОС автоматически освобождает всю доступную процессу память?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
25.02.2015, 16:18
Ответы с готовыми решениями:

Вывести все возможные комбинации размещения 6 объектов
Вывести все возможные комбинации размещения 6 объектов (1,2,3,4,5,6) по двум инстанциям, где один и...

Какая схема размещения массивов в памяти?
Помогите, нужны ответи на вопросы!!!!! 1) Что такое индексация элементов массива? 2) Что такое...

Функция размещения переменных в динамической памяти!
Подскажите ошибку! вроде все сделал по методе, а не работает! проблема с переменными iP1, iP2, iP3...

Объясните правила работы с delete с указателями и массивами (корректное освобождение выделенной памяти)
Указатель содержал ссылку на динамический массив. Массив удалил. Имеет ли смысл применять delete на...

5
7801 / 6566 / 2986
Регистрация: 14.04.2014
Сообщений: 28,709
25.02.2015, 16:26 2
A будет в стеке и s там же.
На каждый new должен быть свой delete.
0
18948 / 9896 / 2420
Регистрация: 30.01.2014
Сообщений: 17,380
25.02.2015, 16:38 3
Цитата Сообщение от Mamontez Посмотреть сообщение
Обязательно ли при выходе освобождать память занятую объектом b, ведь при завершении процесса ОС автоматически освобождает всю доступную процессу память?
Дело не в памяти, а в ресурсах, которые могут быть выделены в классе. Деструктор не вызвался, сокет, например, не закрылся, порт висит занятый, пока система по таймауту его не прибьет. Ну и гарантии, что система там что-то прибьет, в общем случае нет. Этот путь только для тех, кто хочет писать некорректные программы
Цитата Сообщение от Mamontez Посмотреть сообщение
а вот где разместится объект А созданный внутри объекта B, в стеке или в куче внутри объекта B?
Объект А не "внутри" объекта B. Он внутри конструктора (функции), следовательно разместится в стеке. Вот если бы он был членом класса, т.е. фактически находился бы внутри объекта B, то его storage duration была бы такой же, как у объемлющего объекта.
Цитата Сообщение от Mamontez Посмотреть сообщение
Переменная s метода exchange будет создана в стеке и разрушится автоматически при выходе из метода?
Да, в стеке (тоже самое что в примере с конструктором). Да, "разрушится", но на самом деле в данном случае значение останется там же где и было, пока его не перезатрут. Размещение на стеке оттого и быстрое такое, что только указатель стека изменяется на нужный размер.
2
35 / 35 / 15
Регистрация: 28.07.2011
Сообщений: 64
25.02.2015, 17:03 4
ОС освободит. В данном конкретном случае это не проблема. Но подобные практики - путь к утечкам. Особенно, если кто-то будет использовать ваш код кроме вас не разобравшись до конца что он не освобождает память. В цикле. И для демона, который работает на сервере 24/7. При работе в команде такое бывает и по этому иногда лучше быть догматичным до мозга костей.
0
0 / 0 / 0
Регистрация: 25.02.2015
Сообщений: 2
26.02.2015, 13:35  [ТС] 5
Вот если бы он был членом класса, т.е. фактически находился бы внутри объекта B, то его storage duration была бы такой же, как у объемлющего объекта.
А как его сделать членом класса?
Так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
class A{
  public:
    A();
    ~A();
    int i;
    int j;  
}
 
class B{
  public: 
    B();
   ~B();
    int x;
    int y;
   void exchange(void);
   A a;  
}
 
B::B():a(){
 
}
В данной ситуации объект А будет в куче внутри объекта B?
0
18948 / 9896 / 2420
Регистрация: 30.01.2014
Сообщений: 17,380
26.02.2015, 14:15 6
Цитата Сообщение от Mamontez Посмотреть сообщение
В данной ситуации объект А будет в куче внутри объекта B?
Если сам объект типа B будет в куче, то и объекта а (как собственно x и y) внутри него тоже.
1
26.02.2015, 14:15
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
26.02.2015, 14:15
Помогаю со студенческими работами здесь

Выделение памяти под массив объектов
У меня есть класс Shape. Требуется выделить память под массив этих объектов. К примеру: *Shape...

Освобождение памяти динамически созданных объектов
Подскажите, есть к примеру три класса: Class1, Class2, Class3. В Class2 имеется метод, в котором...

Создание объектов в заранее выделенной памяти
Как можно создать объекты в заранее выделенной памяти? Цель: 1. Не запрашивать память динамически...

Размещение объектов в заданных блоках памяти
Здорова! Есть от код: //razmewenie ob6ektov v zadanux blokax pam9ti #include <iostream> using...


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

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru