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

RAII và con trỏ thông minh trong C++

RAII trong C++

RAII (Resource Acquisition Is Initialization) là kỹ thuật C++ điều khiển vòng đời tài nguyên. Đây là biến thể của lớp và gắn liền với vòng đời đối tượng.

Nó đóng gói nhiều tài nguyên vào lớp, nơi cấp phát tài nguyên được thực hiện bởi constructor khi tạo đối tượng và giải phóng tài nguyên bởi destructor khi hủy đối tượng.

Tài nguyên được đảm bảo giữ cho đến khi đối tượng còn sống.

Ví dụ

void file_write {
  static mutex m; // mutex bảo vệ truy cập file
  lock_guard<mutex> lock(m); // khóa mutex trước khi truy cập file
  ofstream file("a.txt");
  if (!file.is_open()) // nếu file không mở được
    throw runtime_error("unable to open file");
  // ghi text vào file
  file << text << std::endl;
}

Con trỏ thông minh (Smart Pointers) trong C++:

Con trỏ thông minh là kiểu dữ liệu trừu tượng, dùng để biến con trỏ thường thành dạng quản lý bộ nhớ như xử lý file, socket mạng, v.v., cũng làm được nhiều việc như hủy tự động, đếm tham chiếu, v.v.

Con trỏ thông minh trong C++ có thể triển khai như lớp template, nạp chồng toán tử * và ->. auto_ptr, shared_ptr, unique_ptr và weak_ptr là các dạng con trỏ thông minh có thể triển khai bằng thư viện C++.

Ví dụ

#include <iostream>
using namespace std;

// Lớp con trỏ thông minh generic
template <class T>
class Smartpointer {
  T *p; // Con trỏ thực tế
public:
  // Constructor
  Smartpointer(T *ptr = NULL) {
    p = ptr;
  }
  // Destructor
  ~Smartpointer() {
    delete(p);
  }
  // Nạp chồng toán tử giải tham chiếu
  T & operator * () {
    return *p;
  }
  // Nạp chồng toán tử mũi tên để truy cập thành viên của T
  T * operator -> () {
    return p;
  }
};

int main() {
  Smartpointer<int> p(new int());
  *p = 26;
  cout << "Value is: " << *p;
  return 0;
}

Kết quả

Value is: 26