Computer >> 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 ++ kiểm soát vòng đời của tài nguyên. Nó là một biến thể của lớp và được gắn với thời gian tồn tại của đối tượng.

Nó đóng gói một số tài nguyên vào lớp trong đó việc cấp phát tài nguyên được thực hiện bởi phương thức khởi tạo trong quá trình tạo đối tượng và việc phân bổ tài nguyên được thực hiện bởi hàm hủy trong quá trình hủy đối tượng.

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

Ví dụ

void file_write {
   Static mutex m; //mutex to protect file access
   lock_guard<mutex> lock(m); //lock mutex before accessing file
   ofstream file("a.txt");
   if (!file.is_open()) //if file is not open
   throw runtime_error("unable to open file");
   // write text to file
   file << text << stdendl;
}

Con trỏ thông minh trong C ++ &trừ;

Con trỏ thông minh là một kiểu dữ liệu trừu tượng bằng cách sử dụng nó, chúng ta có thể tạo một con trỏ bình thường theo cách mà nó có thể được sử dụng làm quản lý bộ nhớ như xử lý tệp, ổ cắm mạng, v.v., nó cũng có thể làm nhiều việc như hủy tự động, đếm tham chiếu, v.v.

Con trỏ thông minh trong C ++, có thể được triển khai dưới dạng lớp mẫu, được nạp chồng bằng toán tử * và ->. auto_ptr, shared_ptr, unique_ptr và yếu_ptr là các dạng con trỏ thông minh có thể được thực hiện bởi các thư viện C ++.

Ví dụ

#include <iostream>
using namespace std;
// A generic smart pointer class
template <class T>
class Smartpointer {
   T *p; // Actual pointer
   public:
      // Constructor
      Smartpointer(T *ptr = NULL) {
         p = ptr;
      }
   // Destructor
   ~Smartpointer() {
      delete(p);
   }
   // Overloading de-referencing operator
   T & operator * () {
      return *p;
   }
   // Over loading arrow operator so that members of T can be accessed
   // like a pointer
   T * operator -> () {
      return p;
   }
};
int main() {
   Smartpointer<int> p(new int());
   *p = 26;
   cout << "Value is: "<<*p;
   return 0;
}

Đầu ra

Value is: 26