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ả.

Tao Không Ngu. viết 11:14 ngày 01/10/2018

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.

Trần Hoàn viết 11:06 ngày 01/10/2018

Ủ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à?

Ice Tea viết 11:07 ngày 01/10/2018

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.

Tao Không Ngu. viết 11:18 ngày 01/10/2018

Hi Trần Hoàn.
Bạn cần làm rõ biến con trỏ và vùng nhớ được trỏ đến.

Trần Hoàn viết 11:19 ngày 01/10/2018

Delete bên ngoài hàm nghĩa là sao?
Có phải ý bạn là kiểu thế này:

double** p = ahjhj(Input);
...
...
delete p;

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?

Tao Không Ngu. viết 11:04 ngày 01/10/2018

Hi Trần Hoàn.
Bạn cần làm rõ biến con trỏ và vùng nhớ được trỏ đến.

Tao Không Ngu. viết 11:17 ngày 01/10/2018

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.

Trần Hoàn viết 11:07 ngày 01/10/2018

Cho mình hỏi là delete[] pdelete p khác gì nhau?

viết 11:04 ngày 01/10/2018

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.

double** Output = new double*[2];
...
return Output;

viết lại là

std::array<std::vector<double>, 2> output;
...
return output; //ngon lành, chả phải nhớ giải phóng phỏng ...ái gì hết
Bài liên quan
0