Saya memiliki class A
yang menggunakan alokasi memori tumpukan untuk salah satu bidangnya. Kelas A dipakai dan disimpan sebagai bidang pointer di kelas lain ( class B
.
Ketika saya selesai dengan objek kelas B, saya sebut delete
, yang saya anggap memanggil destruktor ... Tapi apakah ini memanggil destruktor kelas A juga?
Edit:
Dari jawaban, saya ambil itu (harap edit jika salah):
delete
dari contoh panggilan B B :: ~ B ();- yang memanggil
A::~A();
A::~A
harus secara eksplisitdelete
semua variabel anggota yang dialokasikan tumpukan dari objek A;- Akhirnya blok memori yang menyimpan instance kelas B dikembalikan ke heap - ketika baru digunakan, pertama dialokasikan blok memori pada heap, kemudian memanggil konstruktor untuk menginisialisasi, sekarang setelah semua destructor telah dipanggil untuk menyelesaikan objek yang blokir tempat objek berada dikembalikan ke heap.
sumber
++
operator di dalamnya. Jadi saya bertanya-tanya apakah pointer yang menunjuk di tengah data kelas masih memiliki efek.Ketika Anda memanggil delete pada sebuah pointer yang dialokasikan oleh yang baru, destructor dari objek yang ditunjuk akan dipanggil.
sumber
Ini dinamai "destructor", bukan "deconstructor".
Di dalam destruktor dari setiap kelas, Anda harus menghapus semua variabel anggota lainnya yang telah dialokasikan dengan yang baru.
sunting: Untuk memperjelas:
Katakan sudah
Mengalokasikan instance B dan kemudian menghapus itu bersih, karena apa yang dialokasikan B secara internal juga akan dihapus dalam destruktor.
Tetapi instance dari kelas C akan membocorkan memori, karena mengalokasikan instance dari A yang tidak dilepaskan (dalam hal ini C bahkan tidak memiliki destruktor).
sumber
Jika Anda memiliki pointer biasa (
A*
) maka destructor tidak akan dipanggil (dan memoriA
misalnya tidak akan dibebaskan juga) kecuali Anda melakukannyadelete
secara eksplisit diB
destructor. Jika Anda ingin penghancuran otomatis lihat di pointer pintar sukaauto_ptr
.sumber
Anda harus menghapus A sendiri di destructor B.
sumber
Saat kamu melakukan:
Destruktor akan dipanggil hanya jika kelas dasar Anda memiliki kata kunci virtual.
Maka jika Anda tidak memiliki destruktor virtual saja ~ B () akan dipanggil. Tetapi karena Anda memiliki destruktor virtual, pertama ~ D () akan dipanggil, kemudian ~ B ().
Tidak ada anggota B atau D yang dialokasikan pada heap yang akan dibatalkan alokasi kecuali Anda secara eksplisit menghapusnya. Dan menghapus mereka akan memanggil destructor mereka juga.
sumber
Anda punya sesuatu seperti
Jika Anda menelepon
delete b;
, tidak ada yang terjadi pada, dan Anda memiliki kebocoran memori. Mencoba untuk mengingatdelete b->a;
bukanlah solusi yang baik, tetapi ada beberapa yang lain.Ini adalah destruktor untuk B yang akan menghapus a. (Jika a adalah 0, penghapusan itu tidak menghasilkan apa-apa. Jika a bukan 0 tetapi tidak menunjuk ke memori dari yang baru, Anda mendapatkan banyak tumpukan.)
Dengan cara ini Anda tidak memiliki sebagai penunjuk, melainkan auto_ptr <> (shared_ptr <> akan melakukannya juga, atau pointer pintar lainnya), dan itu secara otomatis dihapus ketika b.
Salah satu dari cara ini bekerja dengan baik, dan saya telah menggunakan keduanya.
sumber
Saya bertanya-tanya mengapa destruktor kelas saya tidak dipanggil. Alasannya adalah saya lupa memasukkan definisi kelas itu (#include "class.h"). Saya hanya punya deklarasi seperti "kelas A;" dan kompiler senang dengan itu dan izinkan saya memanggil "hapus".
sumber
Tidak. Pointer akan dihapus. Anda harus memanggil delete pada A secara eksplisit di destructor B.
sumber
Destructor untuk objek kelas A hanya akan dipanggil jika delete dipanggil untuk objek itu. Pastikan untuk menghapus pointer itu di destructor kelas B.
Untuk sedikit informasi lebih lanjut tentang apa yang terjadi ketika delete dipanggil pada sebuah objek, lihat: http://www.parashift.com/c++-faq-lite/freestore-mgmt.html#faq-16.9
sumber
tidak itu tidak akan memanggil destruktor untuk kelas A, Anda harus menyebutnya secara eksplisit (seperti yang dikatakan PoweRoy), hapus baris 'delete ptr;' misalnya untuk membandingkan ...
sumber