Tôi xin lỗi nếu câu hỏi này là trùng lặp - Tôi đã tìm kiếm trong một thời gian, nhưng có thể là Google-fu của tôi không phải chỉ để ngửi.Làm thế nào bộ nhớ nên được giải phóng sau khi một ngoại lệ được ném vào C + +?
Tôi đang sửa đổi chương trình C++ gọi vào thư viện C. Thư viện C phân bổ một bộ nhớ (sử dụng malloc()
), và chương trình C++ sử dụng nó và sau đó giải phóng nó. Việc nắm bắt là chương trình C++ có thể ném một ngoại lệ giữa chừng thực thi, khiến bộ nhớ được cấp phát không bao giờ được giải phóng.
Là một (chứ không phải giả tạo) ví dụ:
/* old_library.c */
char *allocate_lots() {
char *mem = (char *)malloc(1024);
return mem;
}
/* my_prog.cpp */
void my_class::my_func() {
char *mem = allocate_lots();
bool problem = use(mem);
if (problem)
throw my_exception("Oh noes! This will be caught higher up");
free(mem); // Never gets called if problem is true
}
Câu hỏi của tôi là: làm thế nào ought tôi để đối phó với điều này? Ý tưởng đầu tiên của tôi là bọc toàn bộ thứ trong một khối try/catch, và trong phần đánh bắt, chỉ cần kiểm tra và giải phóng bộ nhớ và vứt bỏ ngoại lệ, nhưng điều này dường như không có vẻ và clunky với tôi (và sẽ không hoạt động tốt nếu tôi muốn thực sự bắt ngoại lệ). Có cách nào tốt hơn để làm điều đó không?
EDIT: Tôi có lẽ đã đề cập rằng chúng tôi đang sử dụng g ++ 4.2.2, từ năm 2007 trước khi std :: unique_ptr được giới thiệu. Phấn nó lên quán tính của công ty.
Tại sao bạn không thể giải phóng bộ nhớ trước khi ném ngoại lệ? –
Sử dụng RAII, sự cố được giải quyết. – Borgleader