2013-07-31 83 views
5
void newHandler() { 
    cdebug << "memory allocation failure" << std::endl; 
    throw std::bad_alloc(); 
} 

int main() { 
    std::set_new_handler(newHandler); 
    // ... 
} 

Khi newHandler được thành lập như là xử lý lỗi của chúng tôi, nó sẽ được gọi là khi bất kỳ phân bổ đống thất bại. Điều thú vị về lỗi xử lý lỗi là nó sẽ được gọi liên tục cho đến khi bộ nhớ phân bổ thành công hoặc chức năng ném lỗi.ngoại lệ đánh bắt cho cấp phát bộ nhớ

Câu hỏi của tôi ở trên văn bản là ý nghĩa của authore cho đến khi phân bổ bộ nhớ thành công hoặc chức năng phát ra lỗi. Làm thế nào có thể chức năng có thể ném một lỗi trong trường hợp này? Yêu cầu với ví dụ để hiểu.

Cảm ơn bạn đã dành thời gian và trợ giúp.

+0

thể trùng lặp của (http://stackoverflow.com/questions/7194127/how- nên-i-write-iso-c-tiêu chuẩn-conformant-custom-new-và-xóa-khai thác) –

+0

@Loki: Đây là một câu hỏi cụ thể hơn so với bản sao có thể bạn đã đăng. Nhưng tôi nghĩ rằng tiêu đề nên được thay đổi để: Làm thế nào để sử dụng std :: set_new_handler – Phong

Trả lời

7

Về cơ bản, xử lý của bạn có thể có 3 hành vi

  • Nó ném một bad_alloc (hoặc lớp derivate của nó).
  • Nó gọi exit hoặc chức năng abord mà dừng việc thực hiện chương trình
  • Nó trở lại, trong trường hợp này là một nỗ lực phân bổ mới sẽ xảy ra

refs: http://www.cplusplus.com/reference/new/set_new_handler/

này là hữu ích nếu bạn không muốn xử lý lỗi phân bổ trên mỗi cuộc gọi mới. Tùy thuộc vào hệ thống của bạn (sử dụng nhiều bộ nhớ), bạn có thể giải phóng bộ nhớ được phân bổ (bộ đệm), do đó việc cấp phát bộ nhớ thử tiếp theo có thể thành công.

void no_memory() 
{ 
    if(cached_data.exist()) 
    { 
    std::cout << "Free cache memory so the allocation can succeed!\n"; 
    cached_data.remove(); 
    } 
    else 
    { 
    std::cout << "Failed to allocate memory!\n"; 
    std::exit (1); // Or throw an expection... 
    } 
} 

std::set_new_handler(no_memory); 
+0

"gửi một expection" nên được "ném một ngoại lệ" –

+0

@Mike: Cảm ơn, tôi sẽ sửa nó. – Phong

0

Mục đích là trình xử lý có thể giải phóng bộ nhớ, trả lại và sau đó new() có thể thử phân bổ lại. new() sẽ gọi trình xử lý miễn là phân bổ vẫn không thành công. Trình xử lý có thể hủy bỏ những nỗ lực này bằng cách ném bad_alloc(), về cơ bản nói 'Tôi không thể giải phóng thêm bộ nhớ nào, do đó việc phân bổ không thể thành công'.

Xem thêm chi tiết tại đây: [? Làm thế nào tôi nên viết C++ chuẩn ISO Conformant tùy chỉnh mới và xóa nhà khai thác]

http://www.cplusplus.com/reference/new/set_new_handler/

Các vấn đề liên quan