Đó là vấn đề lớn. Hàng loạt sản phẩm lập trình lớn như Windows, Mac vẫn thường xuyên bị leak memory. Crash ứng dụng vì bộ nhớ cấp phát liên tục, nguy cơ bảo mật CVE. May mắn rằng chúng ta vẫn có cách nó bằng một thủ thuật đơn giản.

Với Bjarne Stroustrup (cha đẻ của C++), ông có ý tưởng là không dùng new thì không cần delete. Như vậy chúng ta sẽ khởi tạo đối tượng theo cách cổ điển. Việc này sẽ giúp chúng ta bớt phải dùng delete, chỉ cần đối tượng ra khỏi phạm vi cặp ngoặc nhọn là đối tượng sẽ bị hủy.

Ta xem xét ví dụ sau:

#include <cstring>

class String {
private:
    int8_t* m_Data;
    uint32_t m_Size;

public:
    String(const int8_t* src)
    {
        m_Size = strlen(src);
        m_Data = new int8_t[m_Size];
        strcpy(src, m_Data);
    }
    ~String()
    {
        delete[] m_Data;
    }
};

int main()
{
    String sample("Hello");
}

Ví dụ trên mình tự code lại lớp String theo ý tưởng của mình. Khi khởi tạo đối tượng tự gọi constructor, khi ra khỏi cặp ngoặc sẽ gọi hàm destructor.

Vào thời kỳ C++98, chúng ta có thể dùng đến auto_ptr (dựa vào các nguyên tắc của RAII) để dùng tạo đối tượng không cần dùng RAII. Đến cái thời C++11 với việc xuất hiện thêm shared_ptr, unique_ptr, weak_ptr (dựa trên reference counting) nên gần như RAII gần như rất ít được biết đến.  

Comments


Comments are closed