Quản lý bộ nhớ trong C++: new và delete

Trong bài này, bạn sẽ được học cách quản lý bộ nhớ hiệu quả trong C++ sử dụng toán tử new và delete.

Mảng có thể được sử dụng để lưu trữ dữ liệu đồng nhất, nhưng sử dụng mảng cỏ một nhược điểm rất lớn.

Bạn cần cấp phát vùng nhớ cho một mảng khi bạn khai báo nó, nhưng trong hầu hết các trường hợp, kích thước vùng nhớ chính xác cần cung cấp không thể được xác định cho tới khi chạy.

Điều tốt nhất có thể làm trong trường hợp này đó là khai báo một mảng với kích thước vùng nhớ cần thiết lớn nhất có thể (khai báo mảng với kích thước dự kiến là lớn nhất có thể).

Nhược điểm của phương này đó là vùng nhớ không sử dụng sẽ bị lãng phí và không thể được sử dụng bởi các chương trình khác.

Để tránh lãng phí bộ nhớ, bạn có thể cấp phát động vùng nhớ cần thiết tại thời điểm chạy bằng cách sử dụng toán tử newdelete trong C++.

Ví dụ 1: Quản lý bộ nhớ trong C++

Chương trình C++ để lưu GPA của n học sinh và hiển thị nó khi n là số lượng học sinh được nhập vào bởi người dùng.

#include <iostream>
#include <cstring>
using namespace std;

int main()
{
    int num;
    cout << "Enter total number of students: ";
    cin >> num;
    float* ptr;
    
    // Cấp phát vùng nhớ với số lượng số float là num
    ptr = new float[num];

    cout << "Enter GPA of students." << endl;
    for (int i = 0; i < num; ++i)
    {
        cout << "Student" << i + 1 << ": ";
        cin >> *(ptr + i);
    }

    cout << "\nDisplaying GPA of students." << endl;
    for (int i = 0; i < num; ++i) {
        cout << "Student" << i + 1 << " :" << *(ptr + i) << endl;
    }

    // vùng nhớ ptr được giải phóng
    delete [] ptr;

    return 0;
}

Đầu ra

Enter total number of students: 4
Enter GPA of students.
Student1: 3.6
Student2: 3.1
Student3: 3.9
Student4: 2.9

Displaying GPA of students.
Student1 :3.6
Student2 :3.1
Student3 :3.9
Student4 :2.9

Trong chương trình này, chỉ có vùng nhớ cần thiết để lưu num (nhập vào bởi người dùng) dữ liệu dạng dấu phẩy động là được khai báo động.

Toán tử new

ptr = new float[num];

Biểu thức trong chương trình trên trả về một con trỏ tới một vùng bộ nhớ vừa đủ lớn để chứa num số lượng dữ liệu dạng dấu phẩy động.

Toán tử delete

Khi dữ liệu được cấp phát bằng toán tử new, nó cần được giải phóng trả lại hệ điều hành.

Nếu chương trình sử dụng một lượng lớn vùng nhớ thông qua new, hệ thống có thể gặp lỗi vì không có đủ bộ nhớ trên hệ điều hành.

Biểu thức sau sẽ trả vùng nhớ đã cấp phát lại cho hệ điều hành.

delete [] ptr;

Ngoặc vuông thể hiện mảng đã được xóa. Nếu bạn cần xóa chỉ một đối tượng duy nhất, thì bạn không cần sử dụng ngoặc vuông.

delete ptr;

Ví dụ 2: Quản lý bộ nhớ trong C++

Tiếp cận theo cách lập trình hướng đối tượng cho chương trình trên sử dụng C++

#include <iostream>
using namespace std;

class Test
{
private:
    int num;
    float *ptr;

public:
    Test()
    {
        cout << "Enter total number of students: ";
        cin >> num;
        
        ptr = new float[num];
        
        cout << "Enter GPA of students." << endl;
        for (int i = 0; i < num; ++i)
        {
            cout << "Student" << i + 1 << ": ";
            cin >> *(ptr + i);
        }
    }
    
    ~Test() {
        delete[] ptr;
    }

    void Display() {
        cout << "\nDisplaying GPA of students." << endl;
        for (int i = 0; i < num; ++i) {
            cout << "Student" << i+1 << " :" << *(ptr + i) << endl;
        }
    }
    
};
int main() {
    Test s;
    s.Display();
    return 0;
}

Đầu ra của chương trình này giống với chương trình trên.

Khi đối tượng s được tạo, hàm tạo constructor được gọi giúp cấp phát vùng nhớ cần thiết cho num dữ liệu dạng dấu phẩy động.

Khi đối tượng bị xóa, nghĩa là đối tượng vượt ra khỏi phạm vi sử dụng, hàm xóa destructor sẽ tự động được gọi.

    ~Test() {
        delete[] ptr;
    }

Hàm xóa này thực thi câu lệnh delete[] ptr; và trả vùng nhớ lại cho hệ điều hành.

** Nếu bạn muốn viết các nội dung đặt biệt thì hãy làm theo hướng dẫn sau

Xem thêm 10 bình luận
Viết blog mới của bạn
Báo lỗi trang
Đang tải