Форум русскоязычного сообщества Ubuntu


Считаете, что Ubuntu недостаточно дружелюбна к новичкам?
Помогите создать новое Руководство для новичков!

Автор Тема: Вопрос про время жизни переменных?  (Прочитано 308 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн Scot_Tenorman

  • Автор темы
  • Любитель
  • *
  • Сообщений: 74
    • Просмотр профиля
Вопрос про время жизни переменных?
« : 03 Февраль 2012, 04:55:04 »
Пусть имеются два класса A и B. В классе A два поля данных. Одно массив указателей на объекты класса B, второе количество элеменов в этом массиве. Конструктор класса A позволяет мне ввводить определенное число объектов
класса B и сохранять указатели на них в массиве. Пусть в классе A имеется метод который каким-то образом обрабатывает массив. Но проблема в том, что после того как конструктор создаст массив объектов класса B мы больше не увидим - останется тока массив с висячими указателями. Вопрос как оставить объекты класса B вживых
на пртяжении всей программы?

Оффлайн Yurror

  • Старожил
  • *
  • Сообщений: 1966
    • Просмотр профиля
Re: Вопрос про время жизни переменных?
« Ответ #1 : 03 Февраль 2012, 06:19:12 »
Временем жизни выделенных динамически объектов ты управляешь сам.
Когда сказал рождаются, когда скажешь умирают.
я же сказал. выкини нафиг дедушкин учебник. купи современный и прочитай его от корки до корки.

Оффлайн Дядюшка Ау

  • Участник
  • *
  • Сообщений: 123
  • Дайте две!
    • Просмотр профиля
Re: Вопрос про время жизни переменных?
« Ответ #2 : 03 Февраль 2012, 09:56:03 »
Нисколько не пытаясь спорить с Yurror, скажу, что может быть публикация куска проблемного кода быстрее поможет?
Ubuntu 12.04 для поколупацца, Win7 для поработать

Оффлайн Scot_Tenorman

  • Автор темы
  • Любитель
  • *
  • Сообщений: 74
    • Просмотр профиля
Re: Вопрос про время жизни переменных?
« Ответ #3 : 03 Февраль 2012, 13:23:25 »
Временем жизни выделенных динамически объектов ты управляешь сам.
Когда сказал рождаются, когда скажешь умирают.
я же сказал. выкини нафиг дедушкин учебник. купи современный и прочитай его от корки до корки.
Я бы не сказал, что я читаю бабушкин учебник. Всетаки  Лафоре последнего издания.

Оффлайн Yurror

  • Старожил
  • *
  • Сообщений: 1966
    • Просмотр профиля
Re: Вопрос про время жизни переменных?
« Ответ #4 : 04 Февраль 2012, 08:02:42 »
...
Я бы не сказал, что я читаю бабушкин учебник. Всетаки  Лафоре последнего издания.
Я бы не доверил писать учебник по программированию французской актрисе
пролистал я по диагонали книжку. в начале сказано что полностью удовлетворяет стандарту. врут. через 100 страниц уже вовсю юзают всякую микросовтовскую хрень. ну еще в нескольких местах позабавила меня эта книженция. воды очень много. видимо поэтому тебе всё так тяжко даётся.

рассказываю про время жизни динамически выделенных(созданных) объектов
будет у нас для опытов такой класс
Код: C++
  1. class A {
  2.   std::string m;
  3. public:
  4.         A() : m("default") {
  5.     std::cout << __FUNCTION__ "(" << m << ")" << std::endl;
  6.   }
  7.   A(const std::string &str) : m(str) {
  8.     std::cout << __FUNCTION__ "(" << m << ")" << std::endl;
  9.   }
  10.   ~A() {
  11.     std::cout << __FUNCTION__ "(" << m << ")" << std::endl;
  12.   }
  13. };
  14.  

Память можно выделять на стеке (еще называют автоматической памятью), можно в куче (еще называют динамической памятью)
примеры кто когда сколько проживёт
Код: C++
  1. #include <iostream>
  2. #include <string>
  3. #include <memory>
  4.  
  5. // добавить описание нашего класса
  6.  
  7. int main()
  8. {
  9.   std::cout << __LINE__ << std::endl;
  10.   // выделенный таким образом объект
  11.   // будет жить пока программа не выйдет из данного блока
  12.   A a0("test 0 stack alloc");
  13.   std::cout << __LINE__ << std::endl;
  14.  
  15.   // а1 будет жить пока не вызовут delete
  16.   A* a1 = new A("test 1 heap alloc");
  17.   std::cout << __LINE__ << std::endl;
  18.   // вызвали, a1 умирает
  19.   delete a1;
  20.   std::cout << __LINE__ << std::endl;
  21.   // создали еще раз
  22.   a1 = new A("test 2 heap alloc");
  23.   std::cout << __LINE__ << std::endl;
  24.   // не вызвали, не умирает
  25.  
  26.   // создали пачку объектов
  27.   // для каждого вызовется конструктор по умолчанию
  28.   A* a2 = new A[10];
  29.   std::cout << __LINE__ << std::endl;
  30.   // убили, для всех вызовется деструктор
  31.   delete [] a2;
  32.   std::cout << __LINE__ << std::endl;
  33.  
  34.   {
  35.     // нам временно понадобился еще объект
  36.     std::cout << __LINE__ << std::endl;
  37.     A a3("test 3 stack alloc");
  38.     std::cout << __LINE__ << std::endl;
  39.   }
  40.   // тут о нем останутся лишь воспоминания
  41.  
  42.   std::cout << __LINE__ << std::endl;
  43.   // сам объект auto_ptr<A> создаётся на стеке,
  44.   // но он всего лишь обёртка над указателем на
  45.   // реальный объект который лежит в куче
  46.   std::auto_ptr<A> a4(new A("auto_ptr 1"));
  47.   std::cout << __LINE__ << std::endl;
  48.  
  49.   {
  50.     // если объект слишком тяжёл для стека,
  51.     // но ссцыкотно что вожет возникнуть исключение
  52.     // или просто забудем удалить его по выходу из
  53.     // блока можно завернуть его в auto_ptr сам он
  54.     // много места не схавает и когда сам будет умирать
  55.     // убьёт и контролируемый им объект
  56.     std::cout << __LINE__ << std::endl;
  57.     std::auto_ptr<A> a4(new A("auto_ptr 2"));
  58.     std::cout << __LINE__ << std::endl;
  59.   }
  60.  
  61.   // a1 в просрации. остальное освобождено
  62.   std::cout << __LINE__ << std::endl;
  63.  
  64.   return 0;
  65. }
  66.  
auto_ptr deprecated в новом стандарте. ибо подавляющее большинство не осилило его политики передачи владения при копировании. но в данном примере чисто как гуард для освобождения по выходу из области видимости вполне подойдёт.

Обязательно к прочтению
http://www.rsdn.ru/article/cpp/ObjectsAndPointers.xml
http://www.rsdn.ru/article/cpp/ObjectsAndPointers2.xml
http://www.rsdn.ru/article/cpp/smartptr.xml
http://www.rsdn.ru/Forum/Info/FAQ.cpp.whennew.aspx
http://www.rsdn.ru/article/cpp/XXtraps64bit.xml

Оффлайн Scot_Tenorman

  • Автор темы
  • Любитель
  • *
  • Сообщений: 74
    • Просмотр профиля

Оффлайн Yurror

  • Старожил
  • *
  • Сообщений: 1966
    • Просмотр профиля
Re: Вопрос про время жизни переменных?
« Ответ #6 : 04 Февраль 2012, 17:49:41 »
Scot_Tenorman,
я прекрасно понял что за книга. я же написал что пролистал её по диагонали и в некоторых местах автор сделал несколько ляпов.
но ничего, читай.

 

Страница сгенерирована за 0.072 секунд. Запросов: 24.