2010-08-05 12 views
5

Pochodzę ze świata Symbian, jestem przyzwyczajony do używania sterty tak bardzo, jak to możliwe, aby uniknąć wyczerpania przestrzeni stosu, szczególnie podczas pracy z deskryptorami. Klasy pochodne CBase zawsze były dynamicznie przydzielane na stercie, ponieważ gdyby nie były, ich zmienne składowe pozostałyby niezainicjalizowane. Czy ta sama konwencja dotyczy klas pochodnych QObject?Czy klasy pochodne inne niż QObject "zawsze" należy umieścić na stosie?

W Qt wydaje się powszechne umieszczanie na stosie, na przykład QString. Czy zawartość napisu jest umieszczana na stercie, podczas gdy QString działa jako kontener na stosie, czy wszystko jest umieszczone na stosie?

Odpowiedz

10
Jak powiedział sje397: To jest idiomatyczne umieszczenie QString i kontenerów na stosie, ponieważ są one niejawnie udostępniane. Ich elementy wewnętrzne (idiom pimpl "d") są tworzone na stercie. Nie ma sensu tworzyć samego obiektu na stercie. Po prostu powoduje problemy z zarządzaniem pamięcią i tracisz zamierzone właściwości kopiowania przy zapisie podczas przekazywania wskaźników do łańcuchów/kontenerów w pobliżu.

QObjects z drugiej strony, które chcesz utworzyć na stercie w prawie wszystkich przypadkach, ponieważ w przeciwnym razie zostaną ponownie zniszczone. Nie można ich kopiować ani przypisywać (cóż, można wymusić je dla własnych podklas, ale semantyka QObject jest zepsuta), i zazwyczaj mają przetrwać ciało metody, w którym zostały stworzone. Wyjątek to QDialog, czyli często tworzone na stosie, a następnie QDialog::exec, który blokuje do zamknięcia okna dialogowego. Ale nawet to jest ściśle rzecz biorąc niebezpieczne, ponieważ zdarzenia zewnętrzne (wywołania RPC, operacje w tle) mogą spowodować usunięcie okna dialogowego przez jego rodzica (jeśli sam rodzic został usunięty) zanim exec wróci. Następnie utworzenie okna dialogowego na stosie spowoduje podwójne usunięcie podczas rozwijania stosu -> crash.

+0

Dzięki za wyczerpującą odpowiedź. To, wraz z linkiem sje397, wyjaśniło moje zamieszanie. – fejd

Powiązane problemy