Apakah destruktor dipanggil secara otomatis

Pertanyaan saya sederhana, tetapi saya belum dapat menemukan pertanyaan itu di mana pun.

Jika saya memiliki kelas seperti itu

class A {
    vector<int> data;
}

Ketika sebuah instance dari A dihancurkan, apakah data juga akan dihancurkan dengan benar, atau haruskah saya menulis destruktor untuk A yang memanggil destruktor data? Pada dasarnya saya khawatir apakah memori dinamis vektor tidak akan dibebaskan ketika instance A dimusnahkan. Saya menduga jawabannya adalah data dibebaskan dengan benar, tetapi saya tidak ingin mengetahui bahwa saya salah.

Selanjutnya, jika A adalah sebuah struct, apakah destruktor untuk data akan dipanggil ketika instance lokal A berada di luar cakupan?


person Dunes    schedule 28.02.2012    source sumber
comment
Anda tidak memiliki titik koma setelah deklarasi class A (yang sebenarnya bukan deklarasi karena tidak ada... oh baiklah).   -  person Matthieu M.    schedule 28.02.2012


Jawaban (3)


Ya, data akan dimusnahkan secara otomatis, Anda tidak perlu melakukan apa pun untuk mencapainya. vector akan menangani pembersihan memori dinamis yang dialokasikan olehnya. Destruktor vektor akan dipanggil secara otomatis ketika instance A dimusnahkan.

Tidak ada perbedaan perilaku terlepas dari apakah A adalah class atau struct.

person Naveen    schedule 28.02.2012
comment
+1 Untuk lebih jelasnya, vektor akan menangani pembersihan memori dinamis yang dialokasikan oleh, bukan ke. Jika Anda menyimpan objek yang dialokasikan secara dinamis dalam sebuah vektor, Anda bertanggung jawab untuk delete objek tersebut sesuai dengan itu. - person netcoder; 28.02.2012
comment
@netcoder menganggap komentar Anda agak menyesatkan. Anda dapat menyimpan penunjuk ke objek yang dialokasikan secara dinamis dalam vektor, tetapi menurut saya Anda tidak dapat menyimpan objek itu sendiri yang dialokasikan secara dinamis dalam vektor. Jika Anda mendeklarasikan vektor‹ClassA› dengan ClassA sebagai nama kelasnya, maka vektor akan menangani penghancuran objek ClassA yang dimilikinya. Tentu saja, jika objek ClassA Anda menyimpan pointer ke objek lain, maka tanggung jawab ClassA untuk menghapusnya, BUKAN tanggung jawab vektor, tapi lain ceritanya. - person Gab是好人; 29.11.2016

Tidak perlu, destruktor anggota data selalu dipanggil.

Destruktor eksplisit adalah manajemen memori manual yang berguna

struct a{
    int* ip;
    a() 
    : ip(new int(5)) 
    { }

    ~a() { delete ip; }
};

Meskipun demikian, secara umum Anda sebaiknya menggunakan wadah RAII (seperti smart pointer) jadi saya pribadi jarang menulis dtors di sana saat ini.

Dan pengecualian untuk itu adalah mendeklarasikan dtor kelas dasar sebagai virtual.

struct base {
     virtual ~base() {}
};
struct child : public base {
    //base and child destructor automatically called 
}
person 111111    schedule 28.02.2012
comment
+1 untuk mematuhi prinsip RAII yang baik. Kebutuhan untuk menulis destruktor secara manual seharusnya semakin berkurang ketika orang mengkode C++ seperti yang diinginkan oleh Stroustrup, Sutter, Meyers, dan pemikir C++ modern lainnya. - person stinky472; 28.02.2012

Destruktor default dibuat secara otomatis oleh kompiler jika Anda tidak mendefinisikannya sendiri. Secara umum, Anda tidak perlu membuat destruktor sendiri kecuali Anda memiliki anggota data penunjuk yang "memiliki" memori yang ditunjuknya, dan/atau Anda merancang kelas Anda untuk diturunkan oleh kelas lain, pada titik mana Anda ingin untuk setidaknya mendeklarasikan destruktor virtual kosong.

Dalam semua kasus, baik dengan destruktor Anda sendiri, maupun destruktor default yang dibuat oleh kompiler, semua destruktor untuk anggota data non-statis serta kelas dasar apa pun dari kelas saat ini dipanggil di akhir destruktor dan sebelumnya fungsi destruktor itu sendiri kembali.

person Jason    schedule 28.02.2012