Thu hồi bộ nhớ khi hàm kết thúc

anh chị cho em hỏi với. tại sao khi cấp phát bộ nhớ sử dụng con trỏ trỏ tới con trỏ thì không bị thu hồi. còn khi sử dụng con trỏ lại bị thu hồi bộ nhớ.
bộ nhớ không bị thu hồi:

void nhap(int *(*a))
{
    *a = (int*)malloc(sizeof(int));
    for(int i = 0; i<4; i++)
    *(*a+i) = i;
} 

bộ nhớ bị thu hồi:

void nhap(int *a)
{
   a = malloc(4);
   for(int i =0; i<4; i++)
   a[i] = i;
}

Hi Hậu Kòi.
Trong cả hai trương hợp bộ nhớ đều không được thu hồi. Vấn đề là trường hợp thứ 2 bạn không truyền được địa chỉ vung nhớ cấp phát ra nên không dùng được thôi.
P/S Bạn nên học lại về phần con trỏ để hiểu rõ hơn về nó.

2 Likes

cảm ơn bạn. đọc rất nhiều nhưng con trỏ thật là khó hiểu. bạn nói qua qua vậy vẫn chưa hiểu lắm :rofl::rofl::rofl:. bạn cho ví dụ cụ thể để mình hiểu hơn đc không. thank you!!

Muốn hiểu con trỏ thì học qua Assembly.
Bạn sẽ luôn khó hiểu khi không biết phần cứng nó hoạt động ra sao.

2 Likes

Thật tình cờ là mình từng gặp lỗi này. Bạn không bị thu hồi bộ nhớ ở cả 2 trường hợp. Thực chất, bạn bị mất vùng nhớ mà bạn đã khai báo ở trường hợp 2. Mình có viết một bài nói về sai lầm này của mình. Bạn xem qua thử nhé.

2 Likes
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?