2010-11-10 15 views
11

Làm thế nào để kiểm tra xem bộ nhớ mà con trỏ p điểm đã được deallocated thành công?Làm thế nào để kiểm tra sự phân bổ bộ nhớ

+0

Thêm chi tiết cần thiết: bộ nhớ được cấp phát ban đầu như thế nào? và * tại sao * bạn cần phải kiểm tra xem nó đã được deallocated? –

+0

Ở lớp ứng dụng, nó không thể. Tuy nhiên, nếu bạn đang làm việc ở một số tầng hạt nhân rất thấp, có thể có cách để làm điều đó. – Chubsdad

+1

Yeap, vấn đề thực sự bạn đang cố gắng giải quyết là gì? – sharptooth

Trả lời

12

Nói một vài từ: bạn không thể.

Kiểm tra các công cụ như Valgrind để giúp bạn gỡ lỗi các sự cố rò rỉ bộ nhớ.

Một số điều khác bạn nên xem xét:

  • Sử dụng con trỏ thông minh để bạn không phải nghĩ về quản lý bộ nhớ,
  • Đặt con trỏ của bạn để 0 sau khi bạn giải phóng họ, do đó thêm delete không có tác dụng,
  • sử dụng các lớp học chuẩn (vector ...) thay vì cán của riêng bạn,
  • Cuối cùng, đừng sử dụng con trỏ (trên thực tế bạn gần như có thể)
+0

Làm thế nào để thiết lập các con trỏ để 0 giúp đỡ với vấn đề này? –

+0

Để tránh các vấn đề miễn phí đôi. Nó có thể là những gì OP muốn sau khi tất cả. –

+0

Quá xấu thiết lập các con trỏ đến 0 là một UB. –

5

Xin lỗi, câu trả lời rất ngắn "Bạn không thể"

1
  1. Một số công cụ đang thực hiện phân tích mã tĩnh có thể chỉ ra một số vấn đề liên quan đến deallocation bộ nhớ.
  2. Sử dụng valgrind để kiểm tra xem bạn có rò rỉ bộ nhớ
  3. Tránh con trỏ nguyên - sử dụng con trỏ thông minh thay vì
2

Xác định thành công! Xác định deallocated!

Sau khi deallocating bộ nhớ (cho dù đó là miễn phí hoặc xóa), bạn không phải sử dụng con trỏ đó một lần nữa. Tất cả các giả định khác đều không liên quan.

Sau khi tất cả, bạn gọi thời gian chạy C/C++ để deallocate bộ nhớ, nhưng thời gian chạy C/C++ cũng gọi các chức năng của hệ điều hành để giải phóng trang. Bạn thậm chí có thể có một bộ cấp phát bộ nhớ tùy chỉnh ở trên thời gian chạy C/C++, ví dụ: sử dụng bộ nhớ đệm để thực hiện thuật toán phân bổ bộ nhớ nhanh hơn.

Tất cả các lớp này có thể giữ cho bộ nhớ được phân bổ cho chính chúng (do phân mảnh hoặc chỉ vì chúng muốn giữ nó) hoặc có thể yêu cầu lớp bên dưới giải quyết nó. Bất cứ điều gì có thể xảy ra, chỉ cần không sử dụng con trỏ đó nữa.

0

Trong C++, bạn có thể yên tâm giả định deallocation không bao giờ thất bại. Các bộ hủy cấu trúc không được ném ngoại lệ, và bộ nhớ thực sự được bảo lưu sẽ không bao giờ không được giải phóng, do đó, với hai điểm đó, không có gì có thể sai.

Tuy nhiên, nếu bạn xóa con trỏ đã bị xóa, chương trình của bạn có thể sẽ bị lỗi. Đây không phải là một vấn đề với deallocation chính nó mặc dù - ban đầu delete làm việc thành công. Đó là một vấn đề với quản lý bộ nhớ của chương trình của bạn nếu nó cố gắng xóa một con trỏ hai lần, nhưng đó là hiếm khi cần thiết với STL hiện đại và con trỏ thông minh như std::vector, std::unique_ptr, v.v ...

0

Xử lý ngoại lệ. I E. thử/bắt khối.

+5

Không chính xác; một destructor không được ném một ngoại lệ, do đó, điều này sẽ không làm bất cứ điều gì. –

+0

điểm tốt. Cảm ơn. –

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