Tạo và xóa đối tượng
Sau khi một chương trình MQL5 được tải để thực thi, bộ nhớ được cấp phát cho mỗi biến theo kiểu của nó. Theo mức độ truy cập, tất cả các biến được chia thành hai loại - biến toàn cục và biến cục bộ. Theo lớp bộ nhớ, chúng có thể là tham số đầu vào của chương trình MQL5, tĩnh và tự động. Nếu cần, mỗi biến được khởi tạo bằng giá trị tương ứng. Sau khi sử dụng, biến được hủy khởi tạo và bộ nhớ mà nó sử dụng được trả lại cho hệ thống thực thi MQL5.
Khởi tạo và hủy khởi tạo biến toàn cục
Biến toàn cục được khởi tạo tự động ngay sau khi chương trình MQL5 được tải và trước khi bất kỳ hàm nào được gọi. Trong quá trình khởi tạo, các giá trị ban đầu được gán cho các biến của kiểu đơn giản và một hàm tạo (nếu có) được gọi cho các đối tượng. Biến đầu vào luôn được khai báo ở cấp độ toàn cục và được khởi tạo bằng các giá trị do người dùng đặt trong hộp thoại khi khởi động chương trình.
Mặc dù các biến tĩnh thường được khai báo ở cấp độ cục bộ, bộ nhớ cho các biến này được cấp phát trước và việc khởi tạo được thực hiện ngay sau khi chương trình được tải, tương tự như đối với biến toàn cục.
Thứ tự khởi tạo tương ứng với thứ tự khai báo biến trong chương trình. Hủy khởi tạo được thực hiện theo thứ tự ngược lại. Quy tắc này chỉ đúng với các biến không được tạo bởi toán tử new
. Các biến như vậy được tạo và khởi tạo tự động ngay sau khi tải, và được hủy khởi tạo trước khi chương trình được gỡ bỏ.
Khởi tạo và hủy khởi tạo biến cục bộ
Nếu một biến được khai báo ở cấp độ cục bộ không phải là biến tĩnh, bộ nhớ được cấp phát tự động cho biến đó. Biến cục bộ, cũng như biến toàn cục, được khởi tạo tự động tại thời điểm thực thi chương trình gặp khai báo của chúng. Do đó, thứ tự khởi tạo tương ứng với thứ tự khai báo.
Biến cục bộ được hủy khởi tạo khi kết thúc khối chương trình mà chúng được khai báo, theo thứ tự ngược lại với khai báo của chúng. Một khối chương trình là một toán tử ghép có thể là một phần của toán tử lựa chọn switch
, toán tử vòng lặp (for
, while
, do-while
), thân hàm hoặc một phần của toán tử if-else.
Biến cục bộ chỉ được khởi tạo tại thời điểm thực thi chương trình gặp khai báo biến. Nếu trong quá trình thực thi chương trình, khối mà biến được khai báo không được thực thi, biến đó sẽ không được khởi tạo.
Khởi tạo và hủy khởi tạo các đối tượng được đặt động
Một trường hợp đặc biệt là với con trỏ đối tượng, vì khai báo một con trỏ không kéo theo việc khởi tạo các đối tượng tương ứng. Các đối tượng được đặt động chỉ được khởi tạo tại thời điểm mẫu lớp được tạo bởi toán tử new
. Việc khởi tạo đối tượng bao gồm việc gọi hàm tạo của lớp tương ứng. Nếu không có hàm tạo tương ứng trong lớp, các thành viên của nó thuộc kiểu đơn giản sẽ không được khởi tạo tự động; các thành viên của kiểu chuỗi, mảng động và đối tượng phức tạp sẽ được khởi tạo tự động.
Con trỏ có thể được khai báo ở cấp độ cục bộ hoặc toàn cục; và chúng có thể được khởi tạo bằng giá trị rỗng của NULL
hoặc bằng giá trị của con trỏ cùng kiểu hoặc kiểu kế thừa. Nếu toán tử new
được gọi cho một con trỏ được khai báo ở cấp độ cục bộ, toán tử delete
cho con trỏ này phải được thực hiện trước khi thoát khỏi cấp độ đó. Nếu không, con trỏ sẽ bị mất và việc xóa đối tượng rõ ràng sẽ thất bại.
Tất cả các đối tượng được tạo bởi biểu thức object_pointer=new Class_name
, sau đó phải được xóa bằng toán tử delete(object_pointer)
. Nếu vì lý do nào đó biến như vậy không được xóa bằng toán tử delete
khi chương trình hoàn tất, mục tương ứng sẽ xuất hiện trong nhật ký "Experts". Có thể khai báo nhiều biến và gán một con trỏ của một đối tượng cho tất cả chúng.
Nếu một đối tượng được tạo động có hàm tạo, hàm tạo này sẽ được gọi tại thời điểm thực thi toán tử new
. Nếu một đối tượng có hàm hủy, nó sẽ được gọi trong quá trình thực thi toán tử delete
.
Do đó, các đối tượng được đặt động chỉ được tạo tại thời điểm toán tử new
tương ứng được gọi, và được xóa chắc chắn hoặc bằng toán tử delete
hoặc tự động bởi hệ thống thực thi MQL5 trong quá trình gỡ bỏ chương trình. Thứ tự khai báo của các con trỏ của đối tượng được tạo động không ảnh hưởng đến thứ tự khởi tạo của chúng. Thứ tự khởi tạo và hủy khởi tạo hoàn toàn được kiểm soát bởi lập trình viên.
Cấp phát bộ nhớ động trong MQL5
Khi làm việc với mảng động, bộ nhớ được giải phóng sẽ được trả lại ngay lập tức cho hệ điều hành.
Khi làm việc với các đối tượng lớp động bằng toán tử new
, trước tiên bộ nhớ được yêu cầu từ nhóm bộ nhớ lớp mà trình quản lý bộ nhớ đang làm việc. Nếu không đủ bộ nhớ trong nhóm, bộ nhớ được yêu cầu từ hệ điều hành. Khi xóa đối tượng động bằng toán tử delete
, bộ nhớ được giải phóng sẽ được trả lại ngay lập tức cho nhóm bộ nhớ lớp.
Trình quản lý bộ nhớ giải phóng bộ nhớ trở lại hệ điều hành ngay sau khi thoát khỏi các hàm xử lý sự kiện sau: OnInit()
, OnDeinit()
, OnStart()
, OnTick()
, OnCalculate()
, OnTimer()
, OnTrade()
, OnTester()
, OnTesterInit()
, OnTesterPass()
, OnTesterDeinit()
, OnChartEvent()
, OnBookEvent()
.
Đặc điểm ngắn gọn của biến
Thông tin chính về thứ tự tạo, xóa, về các cuộc gọi hàm tạo và hàm hủy được đưa ra trong bảng dưới đây.
Biến tự động toàn cục | Biến tự động cục bộ | Đối tượng được tạo động | |
---|---|---|---|
Khởi tạo | ngay sau khi chương trình mql5 được tải | khi dòng mã khai báo nó được thực thi trong quá trình chạy | tại thời điểm thực thi toán tử new |
Thứ tự khởi tạo | theo thứ tự khai báo | theo thứ tự khai báo | không phụ thuộc vào thứ tự khai báo |
Hủy khởi tạo | trước khi chương trình mql5 được gỡ bỏ | khi thực thi thoát khỏi khối khai báo | khi toán tử delete được thực thi hoặc trước khi chương trình mql5 được gỡ bỏ |
Thứ tự hủy khởi tạo | theo thứ tự ngược lại với thứ tự khởi tạo | theo thứ tự ngược lại với thứ tự khởi tạo | không phụ thuộc vào thứ tự khởi tạo |
Gọi hàm tạo | khi chương trình mql5 được tải | tại thời điểm khởi tạo | tại thời điểm thực thi toán tử new |
Gọi hàm hủy | khi chương trình mql5 được gỡ bỏ | khi thoát khỏi khối nơi biến được khởi tạo | tại thời điểm thực thi toán tử delete |
Nhật ký lỗi | thông báo nhật ký trong nhật ký "Experts" về việc cố gắng xóa một đối tượng được tạo tự động | thông báo nhật ký trong nhật ký "Experts" về việc cố gắng xóa một đối tượng được tạo tự động | thông báo nhật ký trong nhật ký "Experts" về các đối tượng được tạo động chưa được xóa khi gỡ bỏ chương trình mql5 |
Xem thêm
Kiểu dữ liệu, Đóng gói và mở rộng kiểu, Khởi tạo biến, Phạm vi hiển thị và tuổi thọ của biến