Chi tiết bài học Quản lý bộ nhớ trong C++: new và delete

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 trị bộ nhớ hiệu suất cao 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 những trường hợp, size vùng nhớ đúng mực cần cung ứng không hề được xác lập cho tới khi chạy .
Điều tốt nhất hoàn toàn có thể làm trong trường hợp này đó là khai báo một mảng với kích cỡ vùng nhớ thiết yếu lớn nhất hoàn toàn có thể ( khai báo mảng với size dự kiến là lớn nhất hoàn toàn có thể ) .
Nhược điểm của phương này đó là vùng nhớ không sử dụng sẽ bị tiêu tốn lãng phí và không hề được sử dụng bởi những chương trình khác .
Để tránh tiêu tốn lãng phí bộ nhớ, bạn hoàn toàn có thể cấp phát động vùng nhớ thiết yếu tại thời gian chạy bằng cách sử dụng toán tử new và delete 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 
#include 
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 tài liệu dạng dấu phẩy động .

Toán tử delete

Khi tài liệu được cấp phép bằng toán tử new, nó cần được giải phóng trả lại hệ điều hành quản lý .
Nếu chương trình sử dụng một lượng lớn vùng nhớ trải qua new, mạng lưới hệ thống hoàn toàn có thể gặp lỗi vì không có đủ bộ nhớ trên hệ điều hành quản lý .
Biểu thức sau sẽ trả vùng nhớ đã cấp phép lại cho hệ quản lý .

delete [] ptr;

Ngoặc vuông biểu lộ mảng đã được xóa. Nếu bạn cần xóa chỉ một đối tượng người dù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 
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 người dùng s được tạo, hàm tạo constructor được gọi giúp cấp phép vùng nhớ thiết yếu cho num tài liệu dạng dấu phẩy động .
Khi đối tượng người tiêu dùng bị xóa, nghĩa là đối tượng người tiêu dùng vượt ra khỏi khoanh vùng phạm vi sử dụng, hàm xóa destructor sẽ tự động hóa đượ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ệ quản lý và điều hành .