Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> Lập Trình C

exit(), abort() và assert() trong C/C++

exit()

Kết thúc chương trình bình thường. Gọi atexit handlers, flush buffer, đóng file, gọi destructor (C++). Khai báo trong <stdlib.h>.

void exit(int status);

Ví dụ

#include <stdio.h>
#include <stdlib.h>

int main() {
    int x = 10;
    printf("Gia tri x: %d\n", x);
    exit(0);
    printf("Khong in ra"); // Không chạy
    return 0;
}

Kết quả

Gia tri x: 10

abort()

Kết thúc chương trình bất thường (abnormal termination). Không cleanup, không gọi destructor, không flush buffer. Sinh core dump (nếu cấu hình). Khai báo trong <stdlib.h>. Không khuyên dùng cho thoát bình thường.

void abort(void);

Ví dụ

#include <stdio.h>
#include <stdlib.h>

int main() {
    int a = 15;
    printf("Gia tri a: %d\n", a);
    abort();
    printf("Khong in ra");
    return 0;
}

Kết quả

Gia tri a: 15
Aborted (core dumped)

assert()

Kiểm tra điều kiện (debug). Nếu biểu thức sai (0), in thông báo lỗi và gọi abort(). Nếu đúng, không làm gì. Khai báo trong <assert.h>. Thường bị vô hiệu hóa khi define NDEBUG (release build).

void assert(int expression);

Ví dụ

#include <stdio.h>
#include <assert.h>

int main() {
    int a = 15;
    printf("Gia tri a: %d\n", a);
    assert(a != 15); // Sai -> abort
    printf("Khong in ra");
    return 0;
}

Kết quả

Gia tri a: 15
Assertion failed: a != 15, file main.c, line 9
Aborted (core dumped)

Bảng so sánh

HàmLoại thoátCleanupDùng khi
exit()Bình thườngĐầy đủKết thúc chương trình có kiểm soát
_Exit()Bình thườngKhôngSignal handler, tránh deadlock
abort()Bất thườngKhôngLỗi nghiêm trọng không thể phục hồi
assert()Bất thườngKhôngKiểm tra điều kiện debug (precondition)