Czas życia obiektu

0

Cześć,

uczę się programować w c++/qt. Do tej pory miałem do czynienia tylko z językami skryptowymi w związku z tym chciałbym was podpytać o tworzenie obiektów.
Napisałem prostą aplikację okienkową. Przy jej otwieraniu pobieramy z bazy danych konfigurację do klasy Config i na jej podstawie ustawiam sobie program.
W trakcie działania programu są sytuację kiedy chciałbym pobrać jakąś informację z klasy Config i tu moje pytanie.
Czy raz utworzona klasa przy otwieraniu aplikacji będzie dostępna aż do momentu zamknięcia aplikacji (lub oczywiście jej ręcznego usunięcia) ?

0

Zależy jak tworzony jest obiekt klasy Config. Ogólnie to tak, może być utworzony i trzymany w pamięci aż do zamknięcia aplikacji/ręcznego zwolnienia zasobów.

0

W C++ mamy trzy możliwości życia obiektu:

  • globalny / statyczny - zawsze i wszędzie dostępny
  • zaalokowany dynamicznie - dostępny po alokacji przed dealokacją (new/delete lub malloc/free)
  • lokalny - dostępny tylko w funkcji/metodzie.

Przykłady:

class klasa { public: int a; };
  • globalny:
klasa obiekt;
klasa *foo()
{
  obiekt.a = 5; // zawsze i wszędzie
  return &obiekt; // poprawne
}
  • statyczny:
class klasa2 { public: static klasa obiekt; };
klasa klasa2::obiekt;
klasa *foo()
{
  klasa2::obiekt.a = 5; // zawsze i wszędzie
  return &klasa2::obiekt; // poprawne
}
klasa *foo2()
{
  static klasa obiekt;
  return &obiekt; // poprawne
}
  • zaalokowany dynamicznie:
klasa *foo()
{
  return new klasa(); // poprawne
}
void foo2()
{
  klasa *obiekt = foo();
  obiekt->a = 5; // obiekt istnieje, więc możemy
  delete obiekt; // obiekt już więcej nie istnieje, i nie powinniśmy trzymać do niego więcej wskaźników
  obiekt = nullptr; // dla pewności, że wskaźnika do nieistniejącego dla nas obszaru już nie ma
}

-lokalny:

klasa *foo()
{
  klasa obiekt;
  obiekt.a = 5; // możemy, obiekt istnieje lokalnie
  return &obiekt; // program się skompiluje (niektóre kompilatory będą wrzeszczeć, że zwracanie lokalnej zmiennej), ale jest to >błąd<
}

Więc to zależy, co oznacza raz utworzona. Bo raz utworzona może być lokalnie, globalnie, statycznie, lub dynamicznie.

Oczywiście istnieją smart pointery, które dynamicznie zaalokowaną pamięć zwolnią wtedy kiedy trzeba - unique_ptr, shared_ptr, ale jest to po prostu rodzaj wrappera.

0

Dzięki wszystkim za odpowiedź.

A co myślicie aby w moim przypadku użyć wzorca Singleton i zrobić coś podobnego jak na tym tutorialu:

Singleton

2

jak widzę słowo Singleton to mam mordercze zapędy.
95% programistów nadużywa tego wzorca bo jest najłatwiejszy w zrozumieniu, a nie wiedzą, że to wzorzec, który najczęściej potrafi skopać duży projekt.

Przekonałem się o tym, gdy przejąłem od kogoś projekt który miał 20 singletonów zależnych od siebie na wzajem.

1

Ja z kolei się spotkałem z sytuacją, że głównym powodem stosowania singletona było:
"Nie wolno używać zmiennych globalnych, więc zamiast ich używać zrobimy singleton"
Pozostawię to bez komentarza :]

1 użytkowników online, w tym zalogowanych: 0, gości: 1