Dựa trên những gì được coi là thành ngữ trong C ++ 11:
- một iterator vào một container tùy chỉnh tồn tại trong chính container bị phá hủy?
- có thể phát hiện khi iterator bị vô hiệu?
- các điều kiện trên về "bản dựng gỡ lỗi" trong thực tế?
Chi tiết : Gần đây tôi đã tìm hiểu về C ++ của mình và tìm hiểu về C ++ 11. Là một phần trong đó, tôi đã viết một trình bao bọc thành ngữ xung quanh thư viện uriparser . Một phần của điều này là gói đại diện danh sách liên kết của các thành phần đường dẫn được phân tích cú pháp. Tôi đang tìm kiếm lời khuyên về những gì thành ngữ cho container.
Một điều khiến tôi lo lắng, gần đây nhất là từ các ngôn ngữ được thu gom rác, là đảm bảo rằng các đối tượng ngẫu nhiên sẽ không biến mất trên người dùng nếu họ mắc lỗi liên quan đến tuổi thọ. Để giải thích cho điều này, cả PathList
container và các trình vòng lặp của nó đều giữ một shared_ptr
đối tượng trạng thái bên trong thực tế. Điều này đảm bảo rằng miễn là mọi thứ trỏ vào dữ liệu đó tồn tại, dữ liệu cũng vậy.
Tuy nhiên, nhìn vào STL (và rất nhiều tìm kiếm), có vẻ như các thùng chứa C ++ đảm bảo điều này. Tôi có sự nghi ngờ khủng khiếp này rằng kỳ vọng là chỉ để các container bị phá hủy, vô hiệu hóa bất kỳ trình vòng lặp nào cùng với nó. std::vector
chắc chắn dường như để cho các trình vòng lặp có được chức năng không hợp lệ và vẫn (không chính xác).
Điều tôi muốn biết là: những gì được mong đợi từ mã C ++ 11 "tốt" / thành ngữ? Với các con trỏ thông minh mới sáng bóng, có vẻ lạ khi STL cho phép bạn dễ dàng thổi bay chân của mình bằng cách vô tình làm rò rỉ một iterator. Việc sử dụng shared_ptr
dữ liệu sao lưu có phải là không hiệu quả không cần thiết, một ý tưởng tốt để gỡ lỗi hoặc điều gì đó được mong đợi mà STL không làm được?
(Tôi hy vọng rằng việc căn cứ điều này thành "thành ngữ C ++ 11" sẽ tránh được sự chủ quan ...)