Tôi đang làm việc trên thư viện được liên kết động (DAC) quan trọng về hiệu năng, cũng nên có kích thước nhị phân tương đối nhỏ. Vì nó không rõ ràng ném bất kỳ ngoại lệ nào, tôi muốn tắt hoàn toàn hỗ trợ ngoại lệ. Tuy nhiên, có một ngoại lệ (chơi không mong muốn): khi hết bộ nhớ (OOM), tôi phải báo cáo mã lỗi cho ứng dụng để nó có cơ hội xử lý mọi thứ một cách duyên dáng. Cơ sở mã quá lớn để kiểm tra từng phân bổ riêng lẻ và truyền bá lỗi và chứa mã bên ngoài mà tôi không nên chạm vào. Vì vậy, tôi muốn bắt OOM ngoại lệ trong các chức năng xuất khẩu của DLL của tôi. Một thử nghiệm nhanh cho thấy rằng khi vô hiệu hóa ngoại lệ C++ trong Visual C++ 2010 (tức là không có/EHa,/EHsc hoặc/EHs flags), nó vẫn nhảy đến một khối catch (std :: bad_alloc &) khi phân bổ quá nhiều bộ nhớ .Làm thế nào để đảm bảo sự vững chắc ngoài bộ nhớ với các ngoại lệ C++ bị vô hiệu hóa (VS2010)?
Vì vậy, có vẻ như nó hoạt động như mong muốn. Tuy nhiên, tôi nhận được cảnh báo cấp 1 sau: "C4530: C + + xử lý ngoại lệ được sử dụng, nhưng thư giãn ngữ nghĩa không được kích hoạt. Xác định/EHsc". MSDN nói rằng "một đối tượng với lưu trữ tự động trong khung, giữa các chức năng làm ném và chức năng bắt ném, sẽ không bị phá hủy".
Chính xác thì tôi sẽ mất gì ở đây? Bạn nên để mọi thứ ở trạng thái không xác định, miễn là mọi thứ được tạo ra thông qua thư viện có thể bị xóa và ứng dụng có thể bắt đầu lại (nếu nó chọn). Có một nguy cơ lớn rò rỉ bộ nhớ mà không thể được phục hồi?
Dll có sử dụng một bộ nhớ riêng biệt không? Và nếu vậy, tôi có thể thanh lọc nó mà không yêu cầu ứng dụng dỡ bỏ DLL không? Tôi có thể dễ dàng làm cho thư viện của tôi bỏ qua bất kỳ cuộc gọi hàm (xuất khẩu) nữa cho đến khi ứng dụng thực hiện reinitialization.
Cảm ơn lời khuyên của bạn.
* Dll có sử dụng một bộ nhớ riêng biệt không? * Http://stackoverflow.com/questions/10820114/do-statically-linked-dlls-use-a-different-heap-than-the-main-program – thang
* Và nếu vậy, tôi có thể thanh lọc nó mà không yêu cầu ứng dụng dỡ bỏ DLL không? * Vâng, chỉ cần xóa nội dung đó khỏi công cụ mới và miễn phí từ malloc. – thang
Không có xử lý ngoại lệ có nghĩa là các đối tượng được tạo trên ngăn xếp (và bên trong một hàm tạo không thành công) sẽ không bị hủy. Nếu bạn chỉ cần thoát ra khi 'bad_alloc' xảy ra, thì bạn ổn với điều đó, tôi giả sử [miễn là bạn không có tài nguyên lạ mà không được dọn dẹp với chương trình thoát - nhưng hầu hết nên]. Nếu bạn muốn "tiếp tục" sau 'bad_alloc', thì mã sẽ cần phải theo dõi các đối tượng và phá hủy tất cả các đối tượng được tạo trong các khung ngăn xếp giữa' throw' và 'catch'. Bạn có thể thử nghiệm bằng cách viết một số mã nhỏ có bản in trong destructors. –