Đây là một câu hỏi rất cơ bản. Tôi sẽ xây dựng nó bằng cách sử dụng C++ và Java, nhưng nó thực sự là ngôn ngữ độc lập. Xem xét vấn đề nổi tiếng trong C++:Bộ sưu tập rác và quản lý bộ nhớ thủ công
struct Obj
{
boost::shared_ptr<Obj> m_field;
};
{
boost::shared_ptr<Obj> obj1(new Obj);
boost::shared_ptr<Obj> obj2(new Obj);
obj1->m_field = obj2;
obj2->m_field = obj1;
}
Đây là rò rỉ bộ nhớ và mọi người đều biết điều đó :). Giải pháp cũng nổi tiếng: người ta nên sử dụng con trỏ yếu để phá vỡ "khóa liên động". Nó cũng được biết rằng vấn đề này không thể được giải quyết tự động về nguyên tắc. Đó là trách nhiệm của lập trình viên duy nhất để giải quyết nó.
Nhưng có một điều tích cực: một lập trình viên có toàn quyền kiểm soát các giá trị số lần truy cập. Tôi có thể tạm dừng chương trình của tôi trong trình gỡ lỗi và kiểm tra refcount cho obj1, obj2 và hiểu rằng có một vấn đề. Tôi cũng có thể thiết lập một điểm ngắt trong destructor của một đối tượng và quan sát một thời điểm hủy diệt (hoặc tìm ra rằng đối tượng đã không bị phá hủy).
Câu hỏi của tôi là về Java, C#, ActionScript và các ngôn ngữ "Bộ sưu tập rác" khác. Tôi có thể thiếu cái gì, nhưng theo ý kiến của tôi họ
- Đừng để tôi kiểm tra refcount của các đối tượng
- Đừng cho tôi biết khi đối tượng bị phá hủy (okay, khi đối tượng được tiếp xúc với GC)
Tôi thường nghe rằng những ngôn ngữ này chỉ không cho phép một lập trình viên làm rò rỉ bộ nhớ và đó là lý do tại sao chúng tuyệt vời. Theo như tôi hiểu, họ chỉ ẩn các vấn đề quản lý bộ nhớ và làm cho nó khó giải quyết chúng.
Cuối cùng, câu hỏi bản thân:
Java:
public class Obj
{
public Obj m_field;
}
{
Obj obj1 = new Obj();
Obj obj2 = new Obj();
obj1.m_field = obj2;
obj2.m_field = obj1;
}
- Có bộ nhớ bị rò rỉ?
- Nếu có: làm cách nào để phát hiện và khắc phục sự cố?
- Nếu không: tại sao?
Nó không phải là rò rỉ bộ nhớ. Nó không ** bảo vệ bạn khỏi bị rò rỉ bộ nhớ, nhưng không có gì để ngăn cản bạn giải phóng các đối tượng đó trong destructor. Quản lý bộ nhớ là một phần của ** ứng dụng ** thiết kế; hacks cấp thấp sẽ không bù đắp cho việc thiếu thiết kế. –
không cho phép một lập trình viên để rò rỉ bộ nhớ không phải là trường hợp, nhưng những langauges có thể bảo vệ bạn khỏi rò rỉ bộ nhớ trong hầu hết các trường hợp.Đây là một lợi thế lớn cho những lập trình viên không có bất kỳ ý tưởng về bộ nhớ, chúng tôi ít nhất Không cần phải lo lắng quá nhiều về việc rò rỉ bộ nhớ khi gán cho chúng một số dự án nhỏ – StereoMatching
Không có quyền truy cập vào tài khoản vì hầu hết các triển khai không duy trì số lần truy cập, và các ngôn ngữ nói chung cẩn thận không áp đặt các chi tiết triển khai. điều này ngăn việc triển khai tốt hơn - nhanh hơn, mạnh mẽ hơn, hữu ích hơn, v.v.). – delnan