C ve C ++ arasındaki fark nedir exit()
ve abort()
? Bir hatadan sonra programımı sonlandırmaya çalışıyorum (istisna değil).
C ve C ++ arasındaki fark nedir exit()
ve abort()
? Bir hatadan sonra programımı sonlandırmaya çalışıyorum (istisna değil).
Yanıtlar:
abort()
atexit()
ilk olarak kaydedilen işlevleri çağırmadan ve önce nesnelerin yıkıcılarını çağırmadan programınızdan çıkar . exit()
programınızdan çıkmadan önce her ikisini de yapar. Yine de otomatik nesneler için yıkıcılar çağırmaz. Yani
A a;
void test() {
static A b;
A c;
exit(0);
}
Yok edecek a
ve b
düzgün, fakat yıkıcı aramayacak c
. abort()
hiçbir nesnenin yıkıcılarını çağırmazdı. Bu talihsiz bir durum olduğu için, C ++ Standardı, uygun şekilde sonlandırmayı sağlayan alternatif bir mekanizma tanımlar:
Otomatik depolama süresi olan nesnelerin tümü, işlevi
main()
hiçbir otomatik nesne içermeyen ve çağrıyı yürüten bir programda yok edilirexit()
. Kontrolmain()
, yakalanan bir istisna atılarak doğrudan böyle bir a aktarılabilirmain()
.
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);
}
}
Aramak yerine exit()
bu kodu düzenleyin throw exit_exception(exit_code);
.
abort bir SIGABRT sinyali gönderir, çıkış sadece normal temizleme gerçekleştiren uygulamayı kapatır.
Bir iptal sinyalini istediğiniz gibi işleyebilirsiniz , ancak varsayılan davranış, uygulamayı bir hata koduyla da kapatmaktır.
abort , statik ve global üyeleriniz için nesne yok etme gerçekleştirmez, ancak çıkış işlemi gerçekleştirir.
Tabii ki, uygulama tamamen kapatıldığında, işletim sistemi, işlenmemiş bellek ve diğer kaynakları serbest bırakacaktır.
İkisinde de iptal ve çıkış programı sonlandırma, dönüş kodu başvurunuzu başladı ana süreç iade edilecektir (varsayılan davranışı geçersiz vermedi varsayarak).
Aşağıdaki örneğe bakın:
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;
}
Yorumlar:
Eğer iptal uncommented: hiçbir şey yazdırılır ve SomeObject yıkıcı denilen edilmeyecektir.
Eğer iptal yukarıdaki gibi yorumlanır: adı verilecek SomeObject yıkıcının şu çıktıları elde edecek:
çıkış işlevi 2
çıkış işlevi 1
Bir program exit
() çağırdığında aşağıdaki şeyler olur :
atexit
işlevler yürütülürtmpfile
kaldırılırabort
() Fonksiyonu gönderir SIGABRT
o programı açık akışları / kızardı kapalı olduğu veya üzerinden oluşturulan geçici dosyalar hiçbir garantisi ile sonlandırılır yakalandı değilse, mevcut sürecin sinyal tmpfile
kaldırılır, atexit
kayıtlı fonksiyonlar denir değildir ve bir sivil ana bilgisayara sıfır çıkış durumu döndürülür.
Exit () kılavuz sayfasından:
Exit () işlevi, normal işlemin sonlandırılmasına neden olur ve & 0377 durumunun değeri üst öğeye döndürülür.
Abort () kılavuz sayfasından:
Abort () ilk olarak SIGABRT sinyalinin engelini kaldırır ve ardından çağıran işlem için bu sinyali yükseltir. Bu, SIGABRT sinyali yakalanmadıkça ve sinyal işleyici geri dönmedikçe işlemin anormal sonlandırılmasına neden olur.
abort
SIGABRT
sinyali gönderir . abort
arayana geri dönmez. SIGABRT
Sinyal için varsayılan işleyici uygulamayı kapatır. stdio
dosya akışları temizlenir, ardından kapatılır. Bununla birlikte, C ++ sınıfı örnekleri için yıkıcılar değildir (bundan emin değil - belki de sonuçlar tanımsızdır?).
exit
ile ayarlanmış kendi geri aramaları vardır atexit
. Geri aramalar belirtilirse (veya yalnızca biri), kayıt sıralarının tersi sırayla çağrılırlar (bir yığın gibi), ardından program çıkar. Olduğu gibi abort
, exit
arayana döndürmez. stdio
dosya akışları temizlenir, ardından kapatılır. Ayrıca, C ++ sınıf örnekleri için yıkıcılar çağrılır.