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 đó.
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ử
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.
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à 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.
- 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???
- 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:- Sử dụng hàm bad_alloc
- 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 đề
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
Đăng nhận xét