2010-03-10 32 views
7

Đoạn mã dưới đây được biên dịch trong cấu hình Debug trong VS2005 SP1 cho thấy hai thông điệp với thông báo “DANH SÁCH ĐIỀU KHIỂN DANH SÁCH”.DANH SÁCH ITERATOR ĐƯỢC CHỈ ĐỊNH trong std :: string constructor

Code Snippet

#define _SECURE_SCL 0 
#define _HAS_ITERATOR_DEBUGGING 0 

#include <sstream> 
#include <string> 

int main() 
{ 
    std::stringstream stream; 
    stream << "123" << std::endl; 
    std::string str = stream.str(); 
    std::string::const_iterator itFirst = str.begin(); 
    int position = str.find('2'); 
    std::string::const_iterator itSecond = itFirst + position; 
    std::string tempStr(itFirst,itSecond); ///< errors are here 
    return 0; 
} 

Có một lỗi trong trình biên dịch hoặc thư viện tiêu chuẩn?

+0

Xảy ra với tôi trên VS2008. Hấp dẫn. – avakar

+0

Cân nhắc sử dụng codepad.org để thử nghiệm chống lại gcc nhanh chóng: http://codepad.org/mXXYxf99 đây chắc chắn là lỗi cửa sổ/visual studio. hãy báo cáo. –

Trả lời

2

@dirkgently nói gì trong chỉnh sửa của mình. Rõ ràng, một số mã cho std::string nằm trong dll thời gian chạy, cụ thể là định nghĩa macro không có hiệu lực đối với hàm tạo, một mã để gỡ lỗi trình lặp được thực thi. Bạn có thể sửa lỗi này bằng cách liên kết thư viện thời gian chạy tĩnh.

Tôi sẽ coi đây là lỗi, mặc dù có lẽ không có trong Visual Studio, nhưng trong tài liệu.

+0

Cảm ơn bạn. Liên kết tĩnh giải quyết vấn đề. –

3

Tệ của tôi! Chỉnh sửa: Vâng vấn đề với trình biên dịch. Xem this - đặc biệt là phần Nội dung Cộng đồng.

+0

Ý bạn là gì? 'std :: string' không có các trình vòng lặp truy cập ngẫu nhiên. – avakar

+0

tại sao mã có thể được biên dịch hơn? – Vlad

0

Có sự cố với mã của bạn. Vâng, một số trong thực tế:

  1. std.find('2') trả về một size_t, bạn gặp rắc rối diễn viên tiềm năng nếu giá trị của size_t trả lại (như std::string::npos) là vượt trội so với những gì một int thể giữ (bạn sẽ kết thúc với một tiêu cực int tôi nghĩ ...)
  2. nếu position là tiêu cực, hoặc bằng std::string::npos sau đó phạm vi itFirst,itSecond khó xác định (hoặc vì itSecond là trước itFirst hoặc bởi vì nó là quá khứ str.end())

Sửa mã của bạn và kiểm tra xem mã đó có bị ngắt hay không. Iterator Debugging là ở đây để giúp bạn nắm bắt những sai lầm, vô hiệu hóa nó hoạt động như một con đà điểu.

+1

Phiên bản chuỗi của find() thực sự trả về một chuỗi :: string :: size_type. –

+0

Nói chung bạn đúng, nhưng trong trường hợp cụ thể này '_HAS_ITERATOR_DEBUGGING' bị tắt. Nếu bạn đặt '_HAS_ITERATOR_DEBUGGING' thành 1 thì sẽ không có lỗi. Vì vậy, có vẻ là một lỗi trong CRT. – Paul

+0

@Neil: true, và hầu hết các thùng chứa có hiệu quả sử dụng một typedef 'size_type' bên trong cho tất cả các mục đích lập chỉ mục, mà tôi chưa bao giờ thấy khác với' size_t' trong (vài) triển khai của STL mà tôi đã gặp phải. Vấn đề thực sự là thường xuyên nhất mà nó không phải là một giá trị unsigned (kể từ khi lập chỉ mục trong tiêu cực không có ý nghĩa, trừ khi bạn đang sử dụng Python ngọt). –

Các vấn đề liên quan