tôi vẫn nghĩ rằng đây là một câu hỏi thú vị mà không có một câu trả lời dứt khoát, nhưng xin hãy để tôi chia nó ra thành những câu hỏi khác nhau mà bạn đang thực sự hỏi:
1.) Việc chèn một con trỏ vào một lớp cơ sở vào một vectơ trước khi khởi tạo một lớp con ngăn chặn hoặc gây ra các vấn đề với việc truy xuất các lớp kế thừa từ con trỏ đó. [Slicing ví dụ.]
Trả lời: Không, chừng nào bạn chắc chắn 100% của các loại có liên quan đang được chỉ ra, cơ chế này không gây ra tuy nhiên những vấn đề lưu ý những điểm sau đây:
Nếu constructor có nguồn gốc không thành công, bạn bị bỏ lại sau khi bạn có khả năng có một con trỏ lơ lửng ít nhất là ngồi trong vectơ, vì không gian địa chỉ đó [lớp dẫn xuất] nghĩ rằng nó đang được giải phóng cho môi trường hoạt động trên thất bại, nhưng vector vẫn có địa chỉ như là kiểu lớp cơ sở. Lưu ý rằng một vector, mặc dù loại hữu ích, không phải là cấu trúc tốt nhất cho điều này, và ngay cả khi nó được, cần có một số đảo ngược kiểm soát tham gia ở đây để cho phép các đối tượng vector để kiểm soát initialisation của các đối tượng của bạn, do đó, rằng bạn có nhận thức về thành công/thất bại.
Những điểm này dẫn đến câu hỏi thứ 2 ngụ ý:
2.) Đây có phải là một mô hình tốt cho tổng hợp?
Trả lời: Không thực sự, vì những lý do được đề cập ở trên, cộng với những lý do khác (Đẩy một vectơ qua điểm cuối của nó về cơ bản kết thúc bằng một malloc không cần thiết và sẽ ảnh hưởng đến hiệu suất.) Lý tưởng nhất là bạn muốn sử dụng thư viện tổng hợp, hoặc một lớp mẫu và thậm chí tốt hơn, tách riêng việc triển khai chính sách phân bổ/phân bổ khỏi việc triển khai pool, với một giải pháp mức thấp đã được gợi ý, để phân bổ bộ nhớ hồ bơi đầy đủ từ khởi tạo pool và sau đó sử dụng con trỏ này Sử dụng mẫu này, việc phá hủy hồ bơi là an toàn vì hồ bơi sẽ là bộ nhớ liền kề có thể bị phá hủy mà không có bất kỳ vấn đề lơ lửng nào, hoặc rò rỉ bộ nhớ thông qua việc mất tất cả các tham chiếu đối tượng (mất tất cả tham chiếu đến đối tượng có địa chỉ được cấp phát thông qua poo l bởi người quản lý lưu trữ lá bạn với chunk bẩn/s, nhưng sẽ không gây ra một rò rỉ bộ nhớ vì nó được quản lý bởi việc thực hiện hồ bơi.
Trong những ngày đầu của C/C++ (trước khi phổ biến khối lượng của STL), đây là một mô hình tốt đã thảo luận và việc triển khai nhiều và thiết kế có thể được tìm thấy trên mạng trong văn học tốt: Như một ví dụ:
Knuth (1973 Nghệ thuật lập trình máy tính: nhiều tập), và đối với một danh sách đầy đủ hơn, với thêm về tổng hợp, xem:
http://www.ibm.com/developerworks/library/l-memory/
câu hỏi ngụ ý thứ 3 có vẻ là:
3) Đây có phải là kịch bản hợp lệ để sử dụng tổng hợp không?
Trả lời: Đây là quyết định thiết kế được bản địa hóa dựa trên những gì bạn cảm thấy thoải mái, nhưng thành thật mà nói, việc thực hiện của bạn (không có cấu trúc kiểm soát/tổng hợp, có thể chia sẻ tập hợp các bộ đối tượng phụ) cho tôi biết tốt hơn với một danh sách liên kết cơ bản của các đối tượng bao bọc, mỗi đối tượng chứa một con trỏ đến lớp cha của bạn, chỉ được sử dụng cho mục đích giải quyết. Cấu trúc chu kỳ của bạn được xây dựng trên đầu trang này, và bạn chỉ cần sửa đổi/thu nhỏ danh sách theo yêu cầu để chứa tất cả các đối tượng lớp đầu tiên của bạn theo yêu cầu, và khi kết thúc, bạn có thể dễ dàng tiêu diệt chúng một cách hiệu quả một hoạt động O (1) từ trong danh sách được liên kết.
Có nói rằng, cá nhân tôi khuyên bạn nên tại thời điểm này (khi bạn có một kịch bản mà tổng hợp có sử dụng và vì vậy bạn đang ở trong tâm trí đúng) để thực hiện việc xây dựng một quản lý lưu trữ/tổng hợp thiết lập các lớp được paramaterised/typeless bây giờ vì nó sẽ giữ bạn trong tốt cho tương lai.
Tại sao 'B' cần biết về vùng bộ nhớ? Thêm các con trỏ từ mã trình điều khiển ('main') trông giống như nó sẽ vô cùng thích hợp hơn. Và sau đó tất nhiên tuổi thọ của hồ bơi có thể bị giới hạn, điều này có nghĩa là bạn sẽ bị hủy diệt miễn phí khi nó vượt quá phạm vi. – Jon
@Jon: Bạn có nghĩa là thay thế các cuộc gọi đến 'new D (...)' bằng 'memory_pool.emplace_back (new D (...))'? Tôi cho rằng tôi có thể viết một hàm mẫu theo kiểu 'make_shared' để tạo đối tượng, chuyển tiếp các đối số tới hàm tạo và thêm nó vào nhóm bộ nhớ. Tôi vẫn muốn biết nếu mã trên là UB hay không. –