🌱 C++ Dynamic Memory Allocation - Cấp phát động

🌱 C++ Dynamic Memory Allocation - Cấp phát động

Dynamic Memory Allocation là một khái niệm quan trọng trong ngôn ngữ lập trình C/C++. Nó cho phép chúng ta cấp phát và giải phóng bộ nhớ theo yêu cầu trong quá trình thực thi chương trình. Trên thực tế, sử dụng các mảng tĩnh có nhiều trường hợp không thể mở rộng được dữ liệu, cũng như sẽ tốn bộ nhớ khi ta dùng ít dữ liệu hơn so với cấp phát.

    Chẳng hạn, cấp phát một mảng Student[100] để quản lý sinh viên, nhưng nếu có nhiều hơn 100 sinh viên thì sẽ không có thêm bộ nhớ để lưu trữ. Ngược lại, nếu chỉ quản lý khoảng 20 sinh viên thì sẽ thừa ra 80 ô nhớ không sử dụng, dẫn đến lãng phí bộ nhớ.

    Trong bài viết này, chúng ta sẽ tìm hiểu về Dynamic Memory Allocation và cách sử dụng nó trong C++.

    👉 Cấp phát bộ nhớ động

    Trong C++, chúng ta có thể sử dụng hai toán tử để cấp phát bộ nhớ động: new new[]

  • Toán tử new được sử dụng để cấp phát bộ nhớ cho một đối tượng duy nhất,
  • Toán tử new[] được sử dụng để cấp phát bộ nhớ cho một mảng đối tượng.

    Ví dụ:

int *ptr = new int;     // Cấp phát bộ nhớ cho một số nguyên
int *arr = new int[5];  // Cấp phát bộ nhớ cho một mảng gồm 5 số nguyên

    Các toán tử new sẽ cấp phát một số byte trên vùng nhớ Heap, trả về giá trị là một con trỏ, chứa địa chỉ của vùng nhớ trả về (địa chỉ của số nguyên hoặc địa chỉ của mảng). Dev có thể sử dụng con trỏ này để truy xuất đến vùng nhớ được cấp phát như một mảng hoặc con trỏ.

#include <iostream>
using namespace std;

int main()
{
    int *arr = new int[5];
    int idx = 0;
    
    // access to heap memory by array
    for (idx = 0; idx < 5; idx++)
    {
        arr[idx] = idx;
    }
    // access to heap memory by pointer
    for (idx = 0; idx < 5; idx++)
    {
        cout << *(arr+idx) << " ";
    }
}

    Run This Code    

    ➥ Các bạn có thể bấm "Run This Code", kết quả hiển thị trên màn hình console như sau.

0 1 2 3 4

    👉 Giải phóng bộ nhớ động

    Sau khi sử dụng xong, chúng ta phải giải phóng bộ nhớ đã được cấp phát để tránh rò rỉ bộ nhớ. Điều này được thực hiện bằng cách sử dụng toán tử delete delete[].

  • Toán tử delete được sử dụng để giải phóng bộ nhớ đã được cấp phát cho một đối tượng duy nhất,
  • Toán tử delete[] được sử dụng để giải phóng bộ nhớ đã được cấp phát cho một mảng đối tượng.
    Ví dụ:

delete ptr;   // Giải phóng bộ nhớ đã được cấp phát cho một số nguyên
delete[] arr; // Giải phóng bộ nhớ đã được cấp phát cho một mảng số nguyên

    👉 Sử dụng bộ nhớ động trong các cấu trúc dữ liệu

    Dynamic Memory Allocation cũng được sử dụng rất phổ biến trong việc xử lý các cấu trúc dữ liệu như danh sách liên kết - Linked List, Tree, đồ thị, v.v. Bằng cách sử dụng con trỏ Dynamic Memory Allocation, chúng ta có thể cấp phát và giải phóng bộ nhớ theo yêu cầu và linh hoạt trong quá trình làm việc với các cấu trúc dữ liệu này.

struct Node
{
    int data;
    Node* next;
};

// Cấp phát bộ nhớ cho một nút trong danh sách liên kết
Node* newNode = new Node;
newNode->data = 5;
newNode->next = nullptr;

// Giải phóng bộ nhớ sau khi sử dụng xong
delete newNode;

    👉 Kết luận

    Dynamic Memory Allocation trong C++ cho phép chúng ta cấp phát và giải phóng bộ nhớ theo yêu cầu, mở rộng khả năng lưu trữ và quản lý tài nguyên. Tuy nhiên, cần lưu ý rằng việc quản lý bộ nhớ động yêu cầu sự cẩn thận để tránh rò rỉ bộ nhớ và xung đột. 

    Việc sử dụng Smart Pointers và các nguyên tắc quản lý bộ nhớ tốt sẽ giúp đảm bảo an toàn và hiệu quả khi làm việc với Dynamic Memory Allocation.

>>>= Follow ngay =<<<

Để nhận được những bài học miễn phí mới nhất nhé 😊

Chúc các bạn học tập tốt 😊

                                        

Nguyễn Văn Nghĩa

Mình là một người thích học hỏi và chia sẻ các kiến thức về Nhúng IOT.

Đăng nhận xét

Mới hơn Cũ hơn