RAII (Chuyển đổi tài nguyên là Khởi tạo)
RAII là một đặc ngữ phổ biến trong C++ tập trung vào việc sử dụng vòng đời của đối tượng để quản lý tài nguyên. Nó khuyến khích ràng buộc thời gian tồn tại của tài nguyên với phạm vi của một đối tượng tương ứng để nó tự động có được khi một đối tượng được tạo và giải phóng khi đối tượng bị hủy. Điều này giúp đơn giản hóa mã code, tránh rò rỉ và quản lý tài nguyên hiệu quả.
Ví dụ mã code
Đây là một ví dụ về việc sử dụng RAII để quản lý tài nguyên, cụ thể là một mảng được phân bổ động:
class ManagedArray {
public:
ManagedArray(size_t size) : size_(size), data_(new int[size]) {
}
~ManagedArray() {
delete[] data_;
}
// Hàm truy cập
int& operator [](size_t i) {
return data_[i];
}
private:
size_t size_;
int* data_;
};
Sử dụng:
{
ManagedArray arr(10);
arr[0] = 42;
// Không cần giải phóng bộ nhớ một cách rõ ràng, nó sẽ tự động được giải phóng khi arr vượt quá phạm vi.
}
Một trường hợp sử dụng phổ biến khác là quản lý khóa mutex:
class Lock {
public:
Lock(std::mutex& mtx) : mutex_(mtx) {
mutex_.lock();
}
~Lock() {
mutex_.unlock();
}
private:
std::mutex& mutex_;
};
Sử dụng:
std::mutex some_mutex;
void protected_function() {
Lock lock(some_mutex);
// Làm một số công việc phải đồng bộ
// Không cần phải mở khóa mutex một cách rõ ràng, nó sẽ tự động được mở khóa khi khóa vượt quá phạm vi.
}
Trong cả hai ví dụ, hàm tạo thu nhận tài nguyên (bộ nhớ cho mảng và khóa cho mutex) và hàm hủy sẽ giải phóng chúng. Bằng cách này, việc quản lý tài nguyên được gắn với thời gian tồn tại của đối tượng và tài nguyên được giải phóng chính xác ngay cả trong trường hợp ngoại lệ được đưa ra.