xem xét như sau:Có an toàn khi sử dụng emplace_back với một thùng chứa unique_ptrs không?
std::vector<std::unique_ptr<int>> ptrsToInts;
ptrsToInts.emplace_back(new int);
Nếu phân bổ lại xảy ra trong vector, và thất bại (ném std::bad_alloc
), tôi "an toàn" hay tôi sẽ bị rò rỉ một int
?
C++ 11 23.3.6.5 [vector.modifiers]/1 nói:
Nếu một ngoại lệ được ném khác hơn là bởi các nhà xây dựng sao chép, di chuyển nhà xây dựng, nhà điều hành chuyển nhượng, hoặc di chuyển điều hành giao
T
hoặc bởi bất kỳ hoạt động nàoInputIterator
không có hiệu ứng.
có vẻ như đây là vấn đề tiềm năng. Tức là, nếu có "không có hiệu ứng", thì không có unique_ptr
nào được xây dựng, và do đó hành vi hủy diệt sẽ dựa vào delete
con trỏ đó sẽ không xảy ra. (Có thể chỉ ra rằng emplace_back
nên bị cấm đối với các thùng chứa unique_ptr
s)
Điểm tốt. Điều này đã truyền cảm hứng cho tôi từ bỏ việc sử dụng 'new' hoàn toàn có lợi cho' std :: make_unique', để tôi có thể biết mọi phân bổ kết thúc bằng một con trỏ thông minh từ đường đi. – GManNickG
Tôi đã lưu ý sự cố này trong một nhận xét tại đây: http://stackoverflow.com/questions/3283778/why-can-i-not-push-back-a-unique-ptr-into-a-vector/3283795#3283795 –