2010-10-06 38 views
8

Tôi có một dự án sử dụng STL rất nhiều. Bây giờ tôi đang làm việc để chuyển dự án đến một nền tảng cụ thể không hỗ trợ các ngoại lệ. Tôi có thể vô hiệu hóa ngoại lệ, tuy nhiên tôi vẫn cần phải xử lý lỗi STL.Xử lý lỗi STL mà không có ngoại lệ

Có cách tiếp cận nào để xử lý lỗi STL đúng cách với các ngoại lệ bị tắt không? Có bất kỳ bên thứ ba STL thực hiện giúp với nó?

Trả lời

6

Vấn đề với việc sử dụng một trình soạn thảo thư viện std hiện có và biên dịch với các ngoại lệ bị vô hiệu hóa là giao diện std container tự giả định ngoại lệ được bật. Sử dụng các ngoại lệ, toán tử new sẽ ném nếu nó không thể có được bộ nhớ, mà không có ngoại lệ, toán tử new trả về một 0 thay vào đó, mà std container không thể xử lý.

Một cách tiếp cận là chỉ sử dụng thuật toán STL + vectơ. Bạn có thể nhân rộng khoảng 95% những gì các container khác sử dụng. Vấn đề là hầu hết các triển khai STL đều giả định rằng

v.reserve(v.size()+1); 
assert(v.size()+1<=v.capacity()); 

sẽ không bao giờ xác nhận (vì dự trữ sẽ ném nếu không có bộ nhớ). Để đảm bảo điều này không bao giờ ném, tôi đã sử dụng các thùng chứa "dung lượng cố định", nghĩa là các thùng chứa có công suất cố định tại thời gian biên dịch. Về cơ bản đây là những vectơ nơi tôi vượt qua trong một cấp phát đặc biệt. Sau đó, bạn có thể kiểm tra max_size() của vùng chứa trước khi chèn. Sau đó, chỉ cần tránh sử dụng những thứ như tại(). Để có tỷ lệ dự đoán tốt hơn, hãy sử dụng basic_string thay cho vectơ. Điều này buộc bạn chỉ lưu trữ các loại POD mà không bao giờ bị ném khi được sao chép hoặc được tạo mặc định. Các yêu cầu bộ nhớ bổ sung dễ tính toán hơn.

Cách tiếp cận khác là sử dụng các hộp chứa xâm nhập. Đây không phải là ném (bên ngoài sử dụng sai của giao diện có lẽ), vì họ không bao giờ có được bộ nhớ ở nơi đầu tiên.

5

Có thể định cấu hình phiên bản cũ của stlport không sử dụng ngoại lệ. Điều này rõ ràng là không chuẩn nhưng đáp ứng yêu cầu của bạn.