Pointer và bộ nhớ

Function pointer và callback

Callback cho algorithm gọi behavior do caller chọn mà không cần biết implementation.

Function pointer và callback là gì?

Callback cho algorithm gọi behavior do caller chọn mà không cần biết implementation.

Truyền behavior vào một hàm khác.

Điểm quan trọng

  • Pointer chỉ được trỏ tới object còn sống, đúng type hoặc null.
  • Mỗi vùng nhớ sở hữu chỉ được giải phóng đúng một lần.
  • Thể hiện ownership và const rõ ràng trong API.

Code ví dụ bằng C và C++

C
Chạy code →
main.c
#include <stdio.h>

int square(int value) { return value * value; }
int apply(int value, int (*operation)(int)) { return operation(value); }

int main(void) {
    printf("%d\n", apply(6, square));
    return 0;
}
Output dự kiến
36
C++
Chạy code →
main.cpp
#include <functional>
#include <iostream>

int apply(int value, const std::function<int(int)>& operation) {
    return operation(value);
}

int main() {
    int factor = 6;
    std::cout << apply(factor, [](int value) { return value * value; }) << '\n';
}
Output dự kiến
36

So sánh C và C++

C dùng type function pointer rõ ràng; C++ lambda và std::function giữ callable phong phú hơn.

C

Ownership và cleanup là quy ước do lập trình viên tự bảo đảm.

C++

Container và RAII gắn ownership cùng cleanup vào lifetime của object.

Bài tập mở rộng

Chạy cả hai phiên bản rồi thay đổi để quan sát khác biệt về bảo đảm của từng ngôn ngữ.

  • Test null và trường hợp cấp phát thất bại.
  • Chạy AddressSanitizer và UndefinedBehaviorSanitizer.
  • Ghi rõ pointer nào sở hữu và pointer nào chỉ quan sát.