Dalam C dan C ++, apa perbedaan antara exit()
dan abort()
? Saya mencoba untuk mengakhiri program saya setelah kesalahan (tidak terkecuali).
Dalam C dan C ++, apa perbedaan antara exit()
dan abort()
? Saya mencoba untuk mengakhiri program saya setelah kesalahan (tidak terkecuali).
Jawaban:
abort()
keluar dari program Anda tanpa memanggil fungsi yang didaftarkan menggunakan atexit()
terlebih dahulu, dan tanpa memanggil destruktor objek terlebih dahulu. exit()
melakukan keduanya sebelum keluar dari program Anda. Itu tidak memanggil destruktor untuk objek otomatis. Begitu
A a;
void test() {
static A b;
A c;
exit(0);
}
Akan merusak a
dan b
benar, tetapi tidak akan memanggil destruktor dari c
. abort()
tidak akan memanggil destruktor dari kedua objek. Karena ini sangat disayangkan, Standar C ++ menjelaskan mekanisme alternatif yang memastikan penghentian dengan benar:
Objek dengan durasi penyimpanan otomatis semuanya dihancurkan dalam program yang fungsinya
main()
tidak berisi objek otomatis dan mengeksekusi panggilan keexit()
. Kontrol dapat ditransfer langsung ke seperti itumain()
dengan melemparkan pengecualian yang tertangkapmain()
.
struct exit_exception {
int c;
exit_exception(int c):c(c) { }
};
int main() {
try {
// put all code in here
} catch(exit_exception& e) {
exit(e.c);
}
}
Alih-alih menelepon exit()
, alih-alih mengatur kode itu throw exit_exception(exit_code);
.
batalkan mengirim sinyal SIGABRT, keluar hanya menutup aplikasi melakukan pembersihan normal.
Anda dapat menangani sinyal batal sesuka Anda, tetapi perilaku default adalah menutup aplikasi juga dengan kode kesalahan.
batalkan tidak akan melakukan penghancuran objek dari anggota statis dan global Anda, tetapi keluar akan.
Tentu saja meskipun ketika aplikasi ini benar-benar ditutup, sistem operasi akan membebaskan setiap memori yang tidak masuk dan sumber daya lainnya.
Dalam membatalkan dan keluar dari penghentian program (dengan asumsi Anda tidak mengabaikan perilaku default), kode kembali akan dikembalikan ke proses induk yang memulai aplikasi Anda.
Lihat contoh berikut:
SomeClassType someobject;
void myProgramIsTerminating1(void)
{
cout<<"exit function 1"<<endl;
}
void myProgramIsTerminating2(void)
{
cout<<"exit function 2"<<endl;
}
int main(int argc, char**argv)
{
atexit (myProgramIsTerminating1);
atexit (myProgramIsTerminating2);
//abort();
return 0;
}
Komentar:
Jika batalkan uncommented: tidak ada yang dicetak dan destruktor dari beberapa objek tidak akan dipanggil.
Jika batalkan dikomentari seperti di atas: someobject destructor akan dipanggil Anda akan mendapatkan output berikut:
fungsi keluar 2
fungsi keluar 1
Hal-hal berikut terjadi ketika suatu program memanggil exit
():
atexit
fungsi dieksekusitmpfile
dihapusFungsi abort
() mengirimkan SIGABRT
sinyal ke proses saat ini, jika tidak tertangkap program dihentikan tanpa jaminan bahwa stream terbuka memerah / tertutup atau bahwa file sementara yang dibuat melalui tmpfile
dihapus, atexit
fungsi terdaftar tidak dipanggil, dan non- status keluar nol dikembalikan ke host.
Dari halaman manual exit ():
Fungsi exit () menyebabkan terminasi proses normal dan nilai status & 0377 dikembalikan ke induk.
Dari halaman manual abort ():
Batalkan () pertama-tama membuka blokir sinyal SIGABRT, dan kemudian menaikkan sinyal itu untuk proses panggilan. Ini menghasilkan penghentian proses yang abnormal kecuali jika sinyal SIGABRT ditangkap dan penangan sinyal tidak kembali.
abort
mengirimkan SIGABRT
sinyal. abort
tidak kembali ke penelepon. Penangan default untuk SIGABRT
sinyal menutup aplikasi. stdio
aliran file memerah, lalu ditutup. Destructors untuk instance kelas C ++ tidak, (tidak yakin yang ini - mungkin hasilnya tidak terdefinisi?).
exit
memiliki callback sendiri, diatur dengan atexit
. Jika panggilan balik ditentukan (atau hanya satu), mereka dipanggil dalam urutan terbalik dari pesanan pendaftaran mereka (seperti tumpukan), kemudian program keluar. Seperti abort
, exit
tidak kembali ke penelepon. stdio
aliran file memerah, lalu ditutup. Juga, destruktor untuk instance kelas C ++ dipanggil.