Quản lý bộ nhớ trong C++
1. Giới thiệu
Trong C++, bộ nhớ được chia thành hai vùng chính: Stack và Heap. Việc quản lý bộ nhớ hiệu quả giúp tránh rò rỉ bộ nhớ và tối ưu hóa hiệu suất.
2. Bộ nhớ Stack và Heap
- Stack: Quản lý tự động, chứa biến cục bộ và lời gọi hàm.
- Heap: Cấp phát động, quản lý thủ công bằng
newvàdelete.
3. Cấp phát động với new và delete
int* p = new int(10); // Cấp phát động
cout << *p; // In ra giá trị 10
delete p; // Giải phóng bộ nhớ
Cấp phát động cho mảng:
int* arr = new int[5];
for (int i = 0; i < 5; i++) arr[i] = i * 2;
delete[] arr; // Giải phóng bộ nhớ
4. Smart Pointers (Con trỏ thông minh)
Smart pointers (unique_ptr, shared_ptr, weak_ptr) trong thư viện <memory> giúp tự động giải phóng bộ nhớ.
4.1. unique_ptr
#include <memory>
unique_ptr<int> uptr = make_unique<int>(20);
cout << *uptr;
4.2. shared_ptr
#include <memory>
shared_ptr<int> sp1 = make_shared<int>(30);
shared_ptr<int> sp2 = sp1; // Chia sẻ quyền sở hữu
cout << *sp1;
5. Rò rỉ bộ nhớ và cách khắc phục
Rò rỉ bộ nhớ xảy ra khi cấp phát động mà không giải phóng.
void func() {
int* ptr = new int(100); // Không có delete → Rò rỉ bộ nhớ
}
Cách khắc phục: Dùng smart pointers hoặc đảm bảo giải phóng bằng delete.
6. Kết luận
Quản lý bộ nhớ hiệu quả giúp tối ưu chương trình và tránh lỗi. Trong bài tiếp theo, chúng ta sẽ tìm hiểu về nhập xuất tệp trong C++.