Có hai cách có thể xác định rò rỉ bộ nhớ. Trước tiên, nếu dữ liệu không được giải phóng khi không có bất kỳ tham chiếu nào đến nó, dữ liệu đó không thể truy cập được (trừ khi bạn có một số con trỏ bị hỏng hoặc đọc qua dữ liệu trong bộ đệm hoặc thứ gì đó). Về cơ bản, nếu bạn không giải phóng/xóa dữ liệu được phân bổ trên heap, nó sẽ trở thành không sử dụng được và đơn giản là lãng phí bộ nhớ.
Có thể có trường hợp con trỏ bị mất nhưng dữ liệu vẫn có thể truy cập được. Ví dụ, nếu bạn lưu trữ con trỏ trong một int, hoặc lưu trữ một bù đắp cho con trỏ (sử dụng số học con trỏ), bạn vẫn có thể lấy lại con trỏ ban đầu.
Trong định nghĩa đầu tiên này, dữ liệu được xử lý bởi người thu gom rác, theo dõi số tham chiếu đến dữ liệu.
Thứ hai, bộ nhớ cơ bản bị rò rỉ nếu bộ nhớ không được giải phóng/xóa khi sử dụng lần cuối. Nó có thể được tham chiếu, và ngay lập tức có thể miễn phí, nhưng sai lầm đã được thực hiện không làm như vậy. Có thể có một lý do hợp lệ (ví dụ: trong trường hợp một destructor có một số tác dụng phụ lạ), nhưng điều đó cho thấy thiết kế chương trình xấu (theo ý kiến của tôi).
Loại rò rỉ bộ nhớ thứ hai này thường xảy ra khi viết các chương trình nhỏ sử dụng tệp IO. Bạn mở tệp, ghi dữ liệu của bạn, nhưng không đóng nó khi bạn đã hoàn tất. FILE * có thể vẫn nằm trong phạm vi và dễ dàng đóng được. Một lần nữa, có thể có một số lý do để làm điều này (chẳng hạn như khóa ghi truy cập bởi các chương trình khác), nhưng với tôi đó là một lá cờ của thiết kế xấu. Trong định nghĩa thứ hai này, dữ liệu không được xử lý bởi người thu gom rác, trừ khi trình biên dịch/thông dịch viên thông minh (hoặc câm) đủ để biết nó sẽ không được sử dụng nữa, và việc giải phóng dữ liệu sẽ không gây ra bất kỳ tác dụng phụ.
Tôi tin câu trả lời của Brian Gianforcaro là câu trả lời hay nhất và ngắn gọn nhất. – Foredecker
Tại sao bạn không chấp nhận định nghĩa của Wikipedia? –
@Joshua Swink: Bởi vì đó sẽ là cảnh sát trong câu trả lời. :) – Spoike