Thiết kế khôn ngoan, sử dụng phân bổ tự động (stack) nhiều nhất có thể. Bất cứ khi nào bạn cần kéo dài thời gian tồn tại của một đối tượng vượt ra ngoài phạm vi nhất định, sau đó phân bổ động nó.
Và thậm chí như vậy, không bao giờ tự động phân bổ mọi thứ raw. Luôn luôn giữ chúng được bao bọc trong một số loại wrapper thực hiện Quản lý tài nguyên phạm vi (SBRM, đầu tiên được biết đến dưới tên ngu ngốc/vụng về là Resource-Acquisition Is Initialization hoặc RAII.) Đó là phân bổ động nên được giữ trong các đối tượng tự động sẽ làm sạch lên tự động!
Một ví dụ điển hình là std::vector
: bạn không thể làm rò bộ nhớ bên trong thành vector
, bởi vì trình phá hủy được chạy trong mọi trường hợp khi bộ nhớ được giải phóng và nó sẽ giải phóng nó cho bạn. auto_ptr
là con trỏ thông minh đầu tiên và duy nhất có sẵn trong thư viện chuẩn, nhưng nó khá tệ. Tốt hơn là sử dụng shared_ptr
hoặc nhiều con trỏ thông minh phổ biến khác có sẵn trong Boost và/hoặc TR1 và/hoặc C++ 0x.
Hiệu suất khôn ngoan, đối tượng được phân bổ trên ngăn xếp có thể được thực hiện nhanh chóng Ngược lại, phân bổ động thường đòi hỏi nhiều thời gian hơn. Nó hoàn toàn có thể để có được phân bổ động nhanh chóng với các lược đồ phân bổ tùy chỉnh, nhưng thậm chí tốt nhất vẫn sẽ chậm hơn so với phân bổ stack.
Thỉnh thoảng, bạn có thể thấy bạn dành quá nhiều thời gian sao chép các đối tượng xung quanh. Trong trường hợp này, có thể đáng để phân bổ động nó và chỉ di chuyển con trỏ xung quanh. Tuy nhiên, xin lưu ý tôi đã nói "tìm". Loại thay đổi này là thứ bạn tìm thấy bằng cách định hình và đo lường, không bao giờ đoán được.
Vì vậy: Phân bổ tự động khi có thể, phân bổ động khi cần.
Có. Lời khuyên của tôi là đọc cuốn sách này: http://www2.research.att.com/~bs/3rd.html đặc biệt là chương 5: Con trỏ, Mảng và Cấu trúc –
Bạn có hiểu tại sao bạn có thể cần để tạo các đối tượng động? –