Quản lý bộ nhớ động
Dynamic storage cần khi size hoặc lifetime không thể xác định lúc compile.
Quản lý bộ nhớ động là gì?
Dynamic storage cần khi size hoặc lifetime không thể xác định lúc compile.
Cấp phát mảng theo runtime và giải phóng an toàn.
Đ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++
main.c
#include <stdio.h>
#include <stdlib.h>
int main(void) {
size_t count = 5;
int *values = calloc(count, sizeof *values);
if (!values) return 1;
for (size_t i = 0; i < count; ++i) values[i] = (int)(i * i);
printf("last=%d\n", values[count - 1]);
free(values);
return 0;
}
last=16
C++
main.cpp
#include <iostream>
#include <vector>
int main() {
std::vector<int> values(5);
for (std::size_t i = 0; i < values.size(); ++i) values[i] = static_cast<int>(i * i);
std::cout << "last=" << values.back() << '\n';
}
last=16
So sánh C và C++
C phải ghép malloc/calloc với free và kiểm tra thất bại; std::vector tự sở hữu và tự giải phóng, kể cả khi có exception.
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.