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


Следите за новостями русскоязычного сообщества Ubuntu в Twitter-ленте @ubuntu_ru_loco

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

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 страниц уже вовсю юзают всякую микросовтовскую хрень. ну еще в нескольких местах позабавила меня эта книженция. воды очень много. видимо поэтому тебе всё так тяжко даётся.

рассказываю про время жизни динамически выделенных(созданных) объектов
будет у нас для опытов такой класс
Код: (CPP) [Выделить]
class A {
  std::string m;
public:
A() : m("default") {
    std::cout << __FUNCTION__ "(" << m << ")" << std::endl;
  }
  A(const std::string &str) : m(str) {
    std::cout << __FUNCTION__ "(" << m << ")" << std::endl;
  }
  ~A() {
    std::cout << __FUNCTION__ "(" << m << ")" << std::endl;
  }
};

Память можно выделять на стеке (еще называют автоматической памятью), можно в куче (еще называют динамической памятью)
примеры кто когда сколько проживёт
Код: (CPP) [Выделить]
#include <iostream>
#include <string>
#include <memory>

// добавить описание нашего класса

int main()
{
  std::cout << __LINE__ << std::endl;
  // выделенный таким образом объект
  // будет жить пока программа не выйдет из данного блока
  A a0("test 0 stack alloc");
  std::cout << __LINE__ << std::endl;
 
  // а1 будет жить пока не вызовут delete
  A* a1 = new A("test 1 heap alloc");
  std::cout << __LINE__ << std::endl;
  // вызвали, a1 умирает
  delete a1;
  std::cout << __LINE__ << std::endl;
  // создали еще раз
  a1 = new A("test 2 heap alloc");
  std::cout << __LINE__ << std::endl;
  // не вызвали, не умирает
 
  // создали пачку объектов
  // для каждого вызовется конструктор по умолчанию
  A* a2 = new A[10];
  std::cout << __LINE__ << std::endl;
  // убили, для всех вызовется деструктор
  delete [] a2;
  std::cout << __LINE__ << std::endl;
 
  {
    // нам временно понадобился еще объект
    std::cout << __LINE__ << std::endl;
    A a3("test 3 stack alloc");
    std::cout << __LINE__ << std::endl;
  }
  // тут о нем останутся лишь воспоминания
 
  std::cout << __LINE__ << std::endl;
  // сам объект auto_ptr<A> создаётся на стеке,
  // но он всего лишь обёртка над указателем на
  // реальный объект который лежит в куче
  std::auto_ptr<A> a4(new A("auto_ptr 1"));
  std::cout << __LINE__ << std::endl;
 
  {
    // если объект слишком тяжёл для стека,
    // но ссцыкотно что вожет возникнуть исключение
    // или просто забудем удалить его по выходу из
    // блока можно завернуть его в auto_ptr сам он
    // много места не схавает и когда сам будет умирать
    // убьёт и контролируемый им объект
    std::cout << __LINE__ << std::endl;
    std::auto_ptr<A> a4(new A("auto_ptr 2"));
    std::cout << __LINE__ << std::endl;
  }
 
  // a1 в просрации. остальное освобождено
  std::cout << __LINE__ << std::endl;
 
  return 0;
}
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.105 секунд. Запросов: 24.