2010-04-02 31 views
11

Tôi có một chương trình thực hiện một số thuật toán tìm kiếm heuristic và một số tên miền, được thiết kế để đánh giá thực nghiệm các thuật toán khác nhau. Chương trình được viết bằng C++, được xây dựng bằng cách sử dụng GNU toolchain và chạy trên hệ thống Ubuntu 64 bit. Khi tôi chạy thử nghiệm của mình, tôi sử dụng lệnh bash's ulimit để giới hạn số lượng bộ nhớ ảo mà quy trình có thể sử dụng để hệ thống thử nghiệm của tôi không bắt đầu hoán đổi.Tại sao chương trình của tôi thỉnh thoảng bị phân đoạn khi hết bộ nhớ thay vì ném std :: bad_alloc?

Một số kết hợp thuật toán/thử nghiệm nhất định đạt đến giới hạn bộ nhớ mà tôi đã xác định. Hầu hết thời gian, chương trình ném một std :: bad_alloc exception, được in bởi trình xử lý mặc định, tại điểm chương trình chấm dứt. Thỉnh thoảng, thay vì điều này xảy ra, chương trình chỉ đơn giản là segfaults.

Tại sao chương trình của tôi đôi khi bị gián đoạn khi hết bộ nhớ, thay vì báo cáo lỗi không hợp lệ :: bad_alloc và chấm dứt?

+0

segfault có thể được gây ra không chỉ bởi vì bạn đạt đến giới hạn của bộ nhớ – Andrey

+0

Tôi khá biết. Trong trường hợp tôi đã thấy một segfault, quá trình này đã được sử dụng số lượng bộ nhớ gần giới hạn tôi đã chỉ định. Tôi khá tự tin rằng các segfaults tôi thấy không phải do lỗi trong mã của tôi. –

+1

Bạn đã xem xét một hoạt động đơn giản trong GDB (Vâng một vài trong số họ) để xem phần nào của mã seg-lỗi? – Shiroko

Trả lời

8

Một lý do có thể là do bộ nhớ overcommits mặc định của Linux. Yêu cầu bộ nhớ từ hạt nhân xuất hiện để hoạt động ổn, nhưng sau đó khi bạn thực sự bắt đầu sử dụng bộ nhớ, thông báo hạt nhân "Oh crap, tôi hết bộ nhớ", gọi kẻ giết người (OOM) mà chọn một số quá trình nạn nhân và giết chết nó.

Để biết mô tả về hành vi này, hãy xem http://lwn.net/Articles/104185/

+0

Có thể. Một số thông tin khác, tôi đã được chạy như là người dùng duy nhất trên hệ thống thử nghiệm, trong đó có 48GB bộ nhớ. Tôi đã chạy với một bộ nhớ ảo 47GB ulimit, mà nên để lại rất nhiều bộ nhớ lõi cho hệ điều hành. Bài viết được liên kết đến từ năm 2004. Nó vẫn còn liên quan đến ngày hôm nay? –

1

Điều janneb nói. Trong thực tế Linux theo mặc định không bao giờ ném std :: bad_alloc (hoặc trả về NULL từ malloc()).

+0

Tôi giả sử bạn có nghĩa là "std :: bad_alloc không bao giờ được ném theo mặc định trên Linux". Tại sao, sau đó, tôi có thấy std :: bad_alloc được ném từ các chương trình C++ trên một số hệ thống Linux khi chương trình đạt đến giới hạn bộ nhớ của nó không? –

+0

Ngoài ra, tôi nghĩ bạn có nghĩa là 'malloc' hơn là 'tự do'. Trang người đàn ông Linux cho malloc không làm cho nó âm thanh như NULL sẽ không bao giờ được trả lại. –

+0

@Bradford. Tất nhiên bạn có quyền. Đã sửa. –

1

Có thể là một số mã sử dụng không ném mới và không kiểm tra giá trị trả lại.

Hoặc một số mã có thể bắt ngoại lệ và không xử lý hoặc giải mã lại.

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