Khai báo hai biến được gọi là a
chắc chắn là một lỗi; nếu trình biên dịch của bạn chấp nhận điều đó, thì nó bị hỏng. Tôi giả sử bạn có nghĩa là bạn vẫn không nhận được một lỗi nếu bạn thay thế một tuyên bố với người khác.
Truy cập mảng không được kiểm tra phạm vi. Tại thời gian biên dịch, kích thước của một mảng thường không được biết, và ngôn ngữ không yêu cầu kiểm tra ngay cả khi nó được. Vào thời gian chạy, một kiểm tra sẽ làm suy giảm hiệu suất, mà sẽ đi ngược lại triết lý C++ không trả tiền cho một cái gì đó bạn không cần. Vì vậy, truy cập vượt ra ngoài kết thúc của một mảng cho hành vi không xác định, và nó lên đến các lập trình viên để đảm bảo nó không xảy ra.
Đôi khi, quyền truy cập không hợp lệ sẽ gây ra lỗi phân đoạn nhưng điều này không được đảm bảo. Thông thường, bảo vệ bộ nhớ chỉ được áp dụng cho toàn bộ trang bộ nhớ, với kích thước trang điển hình là vài kilobyte. Mọi quyền truy cập trong một trang bộ nhớ hợp lệ sẽ không bị phát hiện. Có một cơ hội tốt mà bộ nhớ bạn truy cập có chứa một số biến chương trình khác hoặc một phần của ngăn xếp cuộc gọi, vì vậy việc viết có thể ảnh hưởng đến hành vi của chương trình theo bất kỳ cách nào bạn có thể tưởng tượng.
Nếu bạn muốn an toàn, bạn có thể sử dụng std::vector
và chỉ truy cập các thành phần của nó bằng chức năng at()
. Điều này sẽ kiểm tra chỉ mục và ném một ngoại lệ nếu nó nằm ngoài phạm vi. Nó cũng sẽ quản lý cấp phát bộ nhớ cho bạn, sửa lỗi rò rỉ bộ nhớ trong ví dụ của bạn.
Nguồn
2012-09-13 15:53:46
Thật không may, hành vi được xác định ** đôi khi ** là tập con của hành vi không xác định: ( – Mahesh
@Mahesh :)) không. –
@LuchianGrigore ** Đôi khi ** – Mahesh