Jestem całkiem nowy w Qt i zastanawiam się nad kilkoma podstawowymi rzeczami związanymi z zarządzaniem pamięcią i życiem obiektów. Kiedy muszę usunąć i / lub zniszczyć moje obiekty? Czy cokolwiek z tego jest obsługiwane automatycznie?
W poniższym przykładzie, które z utworzonych przeze mnie obiektów muszę usunąć? Co dzieje się ze zmienną instancji, myOtherClass
gdy myClass
zostanie zniszczona? Co się stanie, jeśli w ogóle nie usunę (ani nie zniszczę) moich obiektów? Czy to będzie problem z pamięcią?
MyClass.h
class MyClass
{
public:
MyClass();
~MyClass();
MyOtherClass *myOtherClass;
};
MyClass.cpp
MyClass::MyClass() {
myOtherClass = new MyOtherClass();
MyOtherClass myOtherClass2;
QString myString = "Hello";
}
Jak widać, są to dość łatwe rzeczy dla początkujących, ale gdzie mogę się o tym dowiedzieć w łatwy sposób?
(It does this by issuing signals, so it is safe even when you delete child manually before the parent.)
-> To nie jest powód, dla którego jest to bezpieczne. W Qt 4.7.4 elementy potomne QObject są usuwane bezpośrednio (przezdelete
, zobacz qobject.cpp, wiersz 1955). Powodem, dla którego można bezpiecznie usunąć najpierw obiekty podrzędne, jest to, że obiekt QObject mówi swojemu rodzicowi, aby zapomniał o nim, gdy zostanie usunięty.ClassB
dziedziczy poQObject
iClassC
dziedziczy zClassB
,ClassC
zostanie poprawnie zniszczony przez relację rodzic-dziecko Qt tylko wtedyClassB
, gdy destruktor jest wirtualny.Chciałbym rozszerzyć odpowiedź Dębilskiego, wskazując, że pojęcie własności jest bardzo ważne w Qt. Kiedy klasa A przyjmuje na siebie własność klasy B, klasa B jest usuwana, gdy klasa A zostaje usunięta. Istnieje kilka sytuacji, w których jeden obiekt staje się właścicielem innego, nie tylko wtedy, gdy tworzysz obiekt i określasz jego rodzica.
Na przykład:
Inny przykład:
Dlatego często sprawdzaj dokumentację, zwykle określa, czy metoda wpłynie na własność obiektu.
Jak stwierdził Debilski, te zasady mają zastosowanie TYLKO do obiektów pochodzących z QObject. Jeśli twoja klasa nie pochodzi od QObject, będziesz musiał sam poradzić sobie ze zniszczeniem.
źródło
Parent (obiekt QObject lub jego klasa pochodna) ma listę wskaźników do swoich dzieci (QObject / jego pochodne). Rodzic usunie wszystkie obiekty ze swojej listy podrzędnej, podczas gdy rodzic zostanie zniszczony. Możesz użyć tej właściwości QObject, aby obiekty podrzędne były usuwane automatycznie po usunięciu elementu nadrzędnego. Relację można ustanowić za pomocą następującego kodu
Istnieje inny sposób zarządzania pamięcią w Qt za pomocą smartpointera. Poniższy artykuł opisuje różne inteligentne wskaźniki w Qt. https://blog.qt.digia.com/blog/2009/08/25/count-with-me-how-many-smart-pointer-classes-does-qt-have/
źródło
Aby dodać do tych odpowiedzi, w celu weryfikacji, zalecałbym korzystanie z
Visual Leak Detetor
biblioteki do projektów Visual C ++, w tym projektów Qt, ponieważ jest ona oparta na c ++, ta biblioteka jest kompatybilna znew, delete, free and malloc
instrukcjami, jest dobrze udokumentowana i łatwa w użyciu. Nie zapominaj, że kiedy tworzysz własnąQDialog
lubQWidget
odziedziczoną klasę interfejsu, a następnie tworzysz nowy obiekt tej klasy, nie zapomnij wykonaćsetAttribute(Qt::WA_DeleteOnClose)
funkcji swojego obiektu.źródło