Tôi không chắc chắn những gì sai với mã này:Tại sao cuộc gọi đến std :: vector :: back() sụp đổ chương trình của tôi
std::vector<int> myVector(0);
if (myVector.back() == 12)
myVector.push_back(12);
Dường như gọi trở lại() trên một vector rỗng treo các chương trình.
Tôi không hiểu tại sao nó bị lỗi? Chúng ta có cần kiểm tra độ dài của vector trước khi gọi back()
không? hoặc có thể đó là một lỗi?
Tài liệu nói rằng nếu vectơ trống thì nó sẽ trả lại giá trị không xác định.
Tôi nghi ngờ số tiền cho người nào đó cấp cho bạn -1 để sử dụng MSDN làm tham chiếu thay vì tiêu chuẩn C++. Các nhà triển khai được phép xác định thêm những gì họ thực hiện trong trường hợp tiêu chuẩn nói là UB, vì vậy nếu MS muốn đảm bảo rằng 'back()' sẽ trả về khi được sử dụng trên một vectơ trống, chúng có quyền làm như vậy. Nếu bạn đang sử dụng MSVC++ thì bạn có quyền đọc tài liệu của họ. Nhưng thay vào đó, nó có thể là -1 vì không nhận ra rằng sử dụng "giá trị không xác định" theo bất kỳ cách nào, có thể gây ra sự cố. –
@SteveJessop Tôi sẽ nghĩ rằng MSDN là việc thực hiện tiêu chuẩn C++. Nhưng nó cảm thấy kỳ lạ mà gọi một phương pháp trên một yếu tố hợp lệ (theo như tôi biết một trống là vector là một yếu tố hợp lệ) tai nạn chương trình của tôi. Vâng, nếu tiêu chuẩn nói như vậy, do đó, được nó :) – MBen
MSVC++ là * một * thực hiện (xấp xỉ) tiêu chuẩn C++. Các triển khai khác hoạt động khác nhau, nếu tiêu chuẩn không nói rõ hành vi. Lý do tiêu chuẩn không xác định việc gọi 'back()' trên một vectơ trống là việc triển khai như vậy không cần mã đặc biệt cho nó. Do đó, họ có thể chọn để nhanh hơn họ sẽ phải kiểm tra xem liệu vectơ có trống hay không, và làm những việc khác nhau trong các trường hợp khác nhau. Họ sẽ dễ bị tai nạn (hoặc tệ hơn) khi bạn làm điều gì sai trái. Nó có thể cảm thấy kỳ lạ, nhưng đó là một sự đánh đổi được thực hiện như là một phần của thiết kế của ngôn ngữ. –