Saya cukup baru mengenal Qt dan bertanya-tanya tentang beberapa hal dasar dengan manajemen memori dan kehidupan objek. Kapan saya perlu menghapus dan / atau menghancurkan objek saya? Apakah semua ini ditangani secara otomatis?
Pada contoh di bawah ini, objek mana yang saya buat yang perlu saya hapus? Apa yang terjadi pada variabel contoh myOtherClass
ketika myClass
dimusnahkan? Apa yang terjadi jika saya tidak menghapus (atau menghancurkan) objek saya sama sekali? Akankah itu menjadi masalah bagi ingatan?
MyClass.h
class MyClass
{
public:
MyClass();
~MyClass();
MyOtherClass *myOtherClass;
};
MyClass.cpp
MyClass::MyClass() {
myOtherClass = new MyOtherClass();
MyOtherClass myOtherClass2;
QString myString = "Hello";
}
Seperti yang Anda lihat, ini adalah hal yang sangat mudah bagi pemula, tetapi di mana saya dapat mempelajarinya dengan cara yang mudah?
(It does this by issuing signals, so it is safe even when you delete child manually before the parent.)
-> Ini bukanlah alasan mengapa ini aman. Dalam Qt 4.7.4, anak-anak QObject dihapus secara langsung (melaluidelete
, lihat qobject.cpp, baris 1955). Alasan mengapa aman untuk menghapus objek turunan terlebih dahulu adalah karena QObject memberitahu orang tuanya untuk melupakannya ketika dihapus.ClassB
mewarisi dariQObject
danClassC
mewarisi dariClassB
, makaClassC
hanya akan dihancurkan dengan benar oleh hubungan induk-anak Qt jikaClassB
destruktornya virtual.Saya ingin memperluas jawaban Debilski dengan menunjukkan bahwa konsep kepemilikan sangat penting di Qt. Ketika kelas A mengasumsikan kepemilikan kelas B, kelas B dihapus ketika kelas A dihapus. Ada beberapa situasi di mana satu objek menjadi pemilik objek lain, tidak hanya saat Anda membuat objek dan menentukan induknya.
Misalnya:
Contoh lain:
Jadi, sering-seringlah memeriksa dokumentasinya, umumnya menentukan apakah suatu metode akan memengaruhi kepemilikan suatu objek.
Seperti yang dinyatakan oleh Debilski, aturan ini HANYA berlaku untuk objek yang diturunkan dari QObject. Jika kelas Anda tidak berasal dari QObject, Anda harus menangani sendiri penghancurannya.
sumber
Induk (baik objek QObject atau kelas turunannya) memiliki daftar penunjuk ke anak-anaknya (QObject / turunannya). Induk akan menghapus semua objek dalam daftar anaknya sementara induk dimusnahkan. Anda dapat menggunakan properti QObject ini untuk membuat objek anak dihapus secara otomatis ketika induknya dihapus. Relasi dapat dibuat menggunakan kode berikut
Ada cara lain untuk mengelola memori di Qt, menggunakan smartpointer. Artikel berikut menjelaskan berbagai petunjuk cerdas di Qt. https://blog.qt.digia.com/blog/2009/08/25/count-with-me-how-many-smart-pointer-classes-does-qt-have/
sumber
Untuk menambahkan jawaban ini, untuk vérifikasi, saya akan merekomendasikan Anda untuk menggunakan
Visual Leak Detetor
perpustakaan untuk proyek Visual c ++ Anda, termasuk proyek Qt karena berbasis c ++, perpustakaan ini kompatibel dengannew, delete, free and malloc
pernyataan, didokumentasikan dengan baik dan mudah digunakan. Jangan lupa bahwa ketika Anda membuat kelas antarmuka sendiriQDialog
atauQWidget
mewarisi, lalu membuat objek baru dari kelas ini, jangan lupa untuk menjalankansetAttribute(Qt::WA_DeleteOnClose)
fungsi objek Anda.sumber