Ngược lại, bạn nên luôn thích phân bổ ngăn xếp, đến mức theo nguyên tắc chung, bạn không bao giờ nên có mới / xóa trong mã người dùng của mình.
Như bạn nói, khi biến được khai báo trên ngăn xếp, trình hủy của nó sẽ tự động được gọi khi nó vượt ra khỏi phạm vi, đây là công cụ chính của bạn để theo dõi thời gian tồn tại của tài nguyên và tránh rò rỉ.
Vì vậy, nói chung, mỗi khi bạn cần cấp phát một tài nguyên, cho dù đó là bộ nhớ (bằng cách gọi mới), các xử lý tệp, ổ cắm hoặc bất kỳ thứ gì khác, hãy bọc nó trong một lớp mà hàm tạo thu được tài nguyên và trình hủy giải phóng nó. Sau đó, bạn có thể tạo một đối tượng thuộc loại đó trên ngăn xếp và bạn được đảm bảo rằng tài nguyên của bạn sẽ được giải phóng khi nó vượt ra khỏi phạm vi. Bằng cách đó, bạn không phải theo dõi các cặp mới / xóa của mình ở khắp mọi nơi để đảm bảo tránh rò rỉ bộ nhớ.
Tên phổ biến nhất của thành ngữ này là RAII
Ngoài ra, hãy xem xét các lớp con trỏ thông minh được sử dụng để bọc các con trỏ kết quả trong những trường hợp hiếm hoi khi bạn phải cấp phát một thứ gì đó mới bên ngoài một đối tượng RAII chuyên dụng. Thay vào đó, bạn chuyển con trỏ tới một con trỏ thông minh, con trỏ này sau đó theo dõi thời gian tồn tại của nó, ví dụ bằng cách đếm tham chiếu và gọi hàm hủy khi tham chiếu cuối cùng vượt ra khỏi phạm vi. Thư viện chuẩn std::unique_ptr
dành cho việc quản lý dựa trên phạm vi đơn giản và std::shared_ptr
có chức năng đếm tham chiếu để thực hiện quyền sở hữu chung.
Nhiều hướng dẫn chứng minh việc tạo đối tượng bằng cách sử dụng một đoạn mã như ...
Vì vậy, những gì bạn đã phát hiện ra là hầu hết các hướng dẫn đều tệ. ;) Hầu hết các hướng dẫn đều dạy bạn các phương pháp C ++ tệ hại, bao gồm gọi new / delete để tạo các biến khi không cần thiết và giúp bạn mất nhiều thời gian theo dõi thời gian tồn tại của các phân bổ của mình.