Tôi đang làm việc trên cơ sở mã lớn, cũ kỹ cho ứng dụng MFC. Mã này đã được nhiều nhà phát triển làm việc theo thời gian, và kết quả là, chúng tôi có ba cách khác nhau trong toàn bộ mã giao dịch với khả năng thất bại phân bổ mới.Làm các thư viện tĩnh C++ không có mfc được liên kết với một dự án MFC ném bad_alloc hoặc CMemoryException *?
Cách đầu tiên là kiểm tra NULL trên kết quả mới. Chúng tôi không sử dụng nothrownew.obj vì vậy đây rõ ràng là một lỗi cần được dọn dẹp.
Thứ hai là bắt CMemoryException * (có, ngoại lệ C++ được bật trong trình biên dịch). Từ những gì tôi hiểu, MFC sẽ ghi đè lên toán tử chuẩn mới và thay vào đó ném điều này. Tôi khá chắc chắn rằng phương pháp thứ hai này là chính xác trong ứng dụng MFC chính nó. MFC ghi đè mới, với phiên bản ném CMemoryException lạ của nó.
Cuối cùng đến từ cơ sở của chúng tôi những người tốt với C++, nhưng không phải là lập trình MFC không cần thiết. Họ đang bắt const std :: bad_alloc &.
Điều tôi thực sự không biết là những gì mong đợi đối với các thư viện tĩnh được liên kết trong ứng dụng. Đây là phần lớn mã sử dụng bad_alloc. Giả sử các thư viện này không được biên soạn với MFC hoặc ATL, và được viết bằng chuẩn C++, chúng có thể mong đợi để bắt bad_alloc không? Hay sự hiện diện của MFC trong ứng dụng mà chúng liên kết để lây nhiễm chúng với toán tử mới toàn cầu và làm cho các nỗ lực của chúng thất bại trong việc phân phối không đúng?
Nếu bạn có câu trả lời, bạn có thể giải thích cách thức hoạt động hay chỉ cho tôi tham chiếu đúng để sắp xếp điều này không?
Cảm ơn bạn! Chúng tôi liên kết với thời gian chạy C++ chuẩn như một DLL, có nghĩa là ngoại lệ MFC cho tất cả mọi người. Thật không may, một trong những mục tiêu chính của ứng dụng này là một hệ thống không có bộ nhớ ảo, vì vậy việc kiểm tra phân bổ là bắt buộc, ugh. –
Nếu bạn có thể biên dịch với các biểu tượng thì tôi khuyên bạn nên bước vào cuộc gọi đến toán tử mới và trình gỡ lỗi sẽ chứng minh dứt khoát việc triển khai thực hiện nào đang được gọi. Không chắc chắn nếu đó là hữu ích cho tho nền tảng mục tiêu của bạn .. – Henk
Ký hiệu là không có vấn đề. Buộc các chi nhánh để ném một ngoại lệ, cho thấy kết luận rằng CMemoryException * đang được ném. Điều đó làm cho mọi thứ trở nên phức tạp, nhưng thật tốt khi biết những gì đang diễn ra. Cảm ơn một lần nữa! –