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

Thông thường khi lưu trữ dữ liệu cùng kiểu với số lượng lớn hoặc các đối tượng, bạn dùng mảng.
VD:
int a[100];
Nhưng có 1 trở ngại lớn là khi viết chương trình, bạn không biết cụ thể độ dài của mảng là bao nhiêu. Bạn không thể viết:
cin>>n;
int a[n];
Trình biên dịch yêu cầu n phải là hằng hoặc một define nào đó.



Toán tử new


Trong C++, bạn dùng toán tử new để cấp phát động bộ nhớ có kích thước xác định và trả về con trỏ trỏ tới phần tử đầu tiên của mảng.
VD:
pointer = new type   //Cấp phát 1 phần tử
pointer = new type [n_of_elements] //Cấp phát n phần tử


Cách sử dụng

  • Truy cập phần tử đầu tiên: * pointer hoặc pointer[0]
  • Truy cập phần tử thứ i: *(pointer+i) hoặc pointer[i].
Lưu ý:
  1. Là cách cấp phát bằng toán tử new sử dụng vùng nhớ heap ( theo mình biết là đi ngược từ vùng nhớ nào đó trở về null). Còn mảng trong C/C++ thì ngược lại.
  2. Mình thử viết 1 class ( cố tình khai báo hàm tạo và hàm hủy là private), xài malloc, kết quả là dev-C không báo lỗi, nhưng khi chuyển qua new(), thì kết quả biên dịch lại báo lỗi???
  3. Không cấp phát động được cho class. Mình đã thử mãi mà không được. Giải pháp là bạn override operator (dịch tiếng Việt kì quá). VD: new ClassA();

Kiểm tra

Nếu bộ nhớ không đủ, việc cấp phát sẽ thất bại. Trên cplusplus có nêu ra 2 giải pháp:
  1. Sử dụng hàm bad_alloc
  2. Sử dụng nothrow, trả về con trỏ kiểu Null nếu việc cấp pháp không thành công. Bạn nên nhớ khai báo tiêu đề
VD:
bobby = new (nothrow) int [5]; 
Nothrow còn có nhiều công dụng nữa nhưng mình không biết.
Ngoài ra, trình biên dịch sẽ tự động trả về Null khi cấp phát không thành công.

Toán tử Delete

Bạn dùng toán tử delete để giải phóng vùng nhớ được cấp phát.
delete pointer;
delete [] pointer;
Có 1 đều quan trọng mà ít tài liệu nói tới: Khi cấp phát bởi toán tử new với các biến không có constructor (hàm tạo) thì nó sẽ tự giải phóng khi ra khỏi hàm. Còn đối với class, bạn cần phải viết hàm hủy.

Nhận xét

Bài đăng phổ biến từ blog này

Kinh nghiệm tạo biểu đồ Use Case

PHÉP TOÁN XOR

Phần mềm hỗ trợ vẽ bản đồ tư duy trên máy tính

Power Designer 12.5