01/10/2018, 09:03
Hỏi về thu hồi bộ nhớ sau khi chạy hàm trong C++
Theo như mình được biết thi cấp phát bằng new thì nếu dùng xong nên delete để giải phóng bộ nhớ.
Giả sử mình có một hàm ahjhj()
, đại loại như sau:
double** ahjhj(int Input)
{
//Do something
double** Output = new double*[2];
//Do something
return Ouput;
}
Có phải là các biến cục bộ sẽ tự bị xoá sau khi chạy hàm không, vì mình không biết làm thế nào dể delete cái Output = new double*[2]
kia cả.
Bài liên quan
Hi Trần Hoàn.
Đúng là các biến cụ bộ bị xóa sau khi thoat hàm.
Bạn gọi hàm delete như bình thường.
Ủa, nếu các biến cục bộ được giải phóng khi thoát hàm thì khác gì Garbage Collector đâu?
Còn gọi hàm delete Output thì không thể delete sau khi return, trước khi return thì không được delete mà?
Con trỏ không bị xóa sau khi chạy hàm, nó chỉ bị xóa khi chương trình kết thúc hoặc khi
delete
.Trường hợp này bạn không
delete
được bên trong hàm màdelete
nó bên ngoài hàm đó, tức là sau khi chạy cái hàm kia.Hi Trần Hoàn.
Bạn cần làm rõ biến con trỏ và vùng nhớ được trỏ đến.
Delete bên ngoài hàm nghĩa là sao?
Có phải ý bạn là kiểu thế này:
Mình nghĩ là nếu
p = ahjhj(Input);
thì p sẽ trỏ đến vùng nhớ tạm dùng để chạy hàm ahjhj nên nếu delete p sẽ giải phóng Output luôn đúng không?Hi Trần Hoàn.
Bạn cần làm rõ biến con trỏ và vùng nhớ được trỏ đến.
Hi Trần Hoàn.
p không phải con trỏ hàm. Bạn cũng không lấy địa chỉ của hàm nên “p sẽ trỏ đến vùng nhớ tạm dùng để chạy hàm ahjhj” Không đúng. p được gán giá trị mà hàm retủn.
Cho mình hỏi là
delete[] p
vàdelete p
khác gì nhau?delete[] xóa mảng, delete xóa 1 phần tử.
bộ nhớ được cấp phát bởi new[] thật ra có thể có thêm 1 biến n nào đó cho biết bộ nhớ được cấp phát có bao nhiêu phần tử (delete[] ko có truyền vào n thì làm sao biết được mảng cần giải phóng có bao nhiêu phần tử?), còn new thì ko cần vì lúc nào cũng là 1 phần tử.
mảng động (số lượng phần tử thay đổi) thì xài std::vector, tương tự như ArrayList bên C#/Java cho lành, khỏi phải nhớ cấp phát động hay giải phóng gì hết. Còn mảng có số lượng phần tử cố định thì xài std::array.
viết lại là