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.
Nguồn
2010-10-07 13:12:53