2013-05-18 16 views
10

Tôi có một số std::vector. Tôi kiểm tra kích thước của nó là 6 nhưng khi tôi cố gắng truy cập vec[6] để kiểm tra xem nó sẽ cung cấp cho lỗi, tôi nhận được không có lỗi nhưng một số số thay thế. Nó có nên cho lỗi không?Vectơ ra khỏi giới hạn mà không đưa ra lỗi

chỉnh sửa: một cái gì đó như:

struct Element 
{ 
    std::vector<double> face; 
}; 

int main() 
{ 
    Element elm; 

    .... // insert 6 elements into elm.face 

    std::cout << elm.face.size() << std::endl; // answer is 6 
    std::cout << elm.face[6] << std::endl; // answer is some number 
} 
+1

kích thước 6, vì vậy cuối cùng là 'vec [5]' bắt đầu bằng 0 – Bill

+1

Không chắc chắn nơi bạn có ý tưởng rằng 'vectơ' sẽ ném một lỗi trên một chỉ mục không hợp lệ bằng cách sử dụng' toán tử [] '. Các tài liệu chắc chắn nói khác đi. –

+0

'Lưu ý rằng phần tử đầu tiên có vị trí là 0 (không phải 1) .' - http://www.cplusplus.com/reference/vector/vector/operator[]/ – Bill

Trả lời

27

Vectơ STL thực hiện các giới hạn kiểm tra khi hàm thành viên .at() được gọi, nhưng do not perform any checks on the [] operator.

Khi ngoài giới hạn, toán tử [] tạo ra kết quả không xác định.

+7

Hành vi không xác định, do đó việc triển khai được ** cho phép ** giới thiệu kiểm tra giới hạn; sự khác biệt từ 'at' là kiểm tra giới hạn là ** bắt buộc ** đối với' at'. –

3

Đó là hành vi không xác định. Hành vi không xác định không nhất thiết có nghĩa là bạn sẽ gặp lỗi: bạn có thể, nhưng thay vào đó bạn có thể nhận được một số kết quả không có ý nghĩa nhiều.

-1

Cấu trúc dữ liệu được lập chỉ mục bắt đầu từ 0, vì vậy nếu bạn đang truy cập vec [6] thì điều này sẽ vượt quá giới hạn. Có thể bạn không gặp lỗi do vấn đề về bộ nhớ; có thể có một cái gì đó có từ mã trước đó bạn đã chạy, hoặc một số lỗi tương tự. Vui lòng đăng mã.

7

Như đã nêu trong câu trả lời của kgraney, đây là hành vi không xác định. Tuy nhiên, hầu hết các thư viện C++ có một số cơ sở để hủy bỏ, hoặc tăng một ngoại lệ trong các trường hợp như vậy. Thường được kiểm soát bằng cách thiết lập hoặc unsetting macro trình biên dịch cụ thể.

Tôi đã thực hiện một tổng quan về các tài liệu liên quan:

gnu libstdC++

kêu vang libcxx

tăng

Microsoft

Lưu ý rằng gnu và kêu vang vô hiệu hóa các kiểm tra theo mặc định, trong khi microsoft đã cho họ được kích hoạt theo mặc định. Nếu bạn không biết điều này, mã của bạn có thể chạy chậm hơn đáng kể trong chế độ gỡ lỗi trên hệ thống microsoft.

+0

... có thể chạy chậm hơn đáng kể * trong chế độ gỡ lỗi * trên hệ thống microsoft. – legalize