×

Giải phóng bộ nhớ với từ khóa delete trong C++

Trong quá trình lập trình, việc quản lý bộ nhớ có vai trò vô cùng quan trọng nhằm tránh tình trạng lãng phí tài nguyên cũng như các lỗi nghiêm trọng hoặc khó kiểm soát. Trong ngôn ngữ lập trình C++, từ khóa delete được sử dụng để giải phóng bộ nhớ đã được cấp phát động (dynamic allocation) bởi từ khóa new.

Khi bạn sử dụng new để cấp phát bộ nhớ cho một biến hoặc một đối tượng, bộ nhớ này không tự động được giải phóng khi chương trình kết thúc hay khi biến ra khỏi phạm vi (scope). Nếu không có biện pháp giải phóng, điều này sẽ dẫn tới tình trạng rò rỉ bộ nhớ (memory leak), một trong những nguyên nhân chính làm giảm hiệu suất của chương trình và có thể gây ra tình trạng ứng dụng bị treo.

Dưới đây là cách sử dụng từ khóa delete trong C++:

Giải phóng bộ nhớ cho biến đơn

Khi cấp phát bộ nhớ cho một biến đơn bằng cách sử dụng từ khóa new, bạn có thể giải phóng bộ nhớ đã cấp phát bằng từ khóa delete.

int* p = new int; // Cấp phát động cho một biến nguyên (int)
*p = 10;         // Gắn giá trị cho biến
delete p;        // Giải phóng bộ nhớ

Giải phóng bộ nhớ cho mảng

Trong trường hợp cấp phát bộ nhớ cho một mảng bằng cách sử dụng new[], bạn cần sử dụng delete[] để giải phóng bộ nhớ.

int* arr = new int[10]; // Cấp phát động cho một mảng 10 phần tử
for(int i = 0; i < 10; ++i) {
    arr[i] = i;         // Gắn giá trị cho các phần tử trong mảng
}
delete[] arr;          // Giải phóng bộ nhớ cho mảng

Giải phóng bộ nhớ cho đối tượng

Từ khóa delete không chỉ sử dụng cho các biến nguyên thủy mà còn áp dụng được cho các đối tượng phức tạp.

class MyClass {
public:
    MyClass() { /* Constructor */ }
    ~MyClass() { /* Destructor */ }
};

MyClass* obj = new MyClass(); // Cấp phát động cho đối tượng
delete obj;                   // Giải phóng bộ nhớ

Lưu ý khi sử dụng từ khóa delete

  • Không giải phóng bộ nhớ đã được giải phóng: Việc cố gắng giải phóng lại bộ nhớ đã được giải phóng sẽ dẫn tới lỗi runtime, thường là lỗi "double delete".
  • Không giải phóng bộ nhớ không được cấp phát bằng new: Chỉ sử dụng delete cho bộ nhớ cấp phát bằng new. Nếu bạn cố gắng giải phóng bộ nhớ không phải từ new, điều này có thể dẫn đến những lỗi không xác định và làm chương trình bị sập.
  • Đặt con trỏ về nullptr sau khi giải phóng: Việc đặt con trỏ về nullptr sau khi giải phóng bộ nhớ là một thói quen tốt, giúp tránh tình trạng sử dụng lại con trỏ trỏ đến vùng nhớ đã giải phóng.
int* p = new int;
delete p;
p = nullptr; // Con trỏ giờ đây trỏ tới một giá trị vô hiệu

Tổng kết

Việc quản lý bộ nhớ một cách cẩn thận là vô cùng quan trọng trong lập trình, đặc biệt là với những ngôn ngữ không có bộ thu gom rác (garbage collector) như C++. Sử dụng từ khóa delete một cách hiệu quả sẽ giúp bạn tránh được các lỗi rò rỉ bộ nhớ và giúp chương trình của bạn chạy một cách mượt mà và ổn định hơn.

Comments