Hãy xem xét các chương trình sau đây:Khi nào thì một đối tượng trên heap đi ra khỏi phạm vi
int main() {
while(...) {
int* foobar = new int;
}
return 0;
}
Khi nào foobar
đi ra khỏi phạm vi?
Tôi biết khi sử dụng new
, thuộc tính được phân bổ trên heap và cần phải được xóa theo cách thủ công với delete
, trong đoạn mã trên, nó gây ra rò rỉ bộ nhớ. Tuy nhiên, những gì về phạm vi?
Tôi nghĩ rằng nó sẽ đi ra khỏi phạm vi ngay sau khi vòng lặp while chấm dứt, bởi vì bạn không có quyền truy cập trực tiếp vào nó nữa. Ví dụ: bạn không thể delete
sau khi vòng lặp kết thúc.
Đây là khó khăn, bởi vì 'foobar' là một con trỏ, mà chính xác đi ra khỏi phạm vi và nó bị phá hủy (nhưng đối tượng nó trỏ vào là _not_ deallocated). 'Int' là một đối tượng trên heap, không có phạm vi, và vì bạn không có lệnh' delete', nó bị rò rỉ. –