Đối với mã bên dưới: (1) "chính" gọi hàm "f1". (2) chức năng "f1" thực hiện một số thao tác số; tạo một mảng của "char" với malloc và sau đó, trả về con trỏ của mảng tới chính (không có de-allocating -freeing- array).Bộ nhớ được cấp phát trong một hàm vẫn được cấp phát sau khi hàm trả về?
Tôi có 3 câu hỏi liên quan đến vụ án: (1) Tôi giả định, mặc dù hàm "f1" đã chấm dứt, mảng char được phân bổ vẫn được cấp phát cho đến khi chương trình chính kết thúc hoàn toàn. Đó là, bộ nhớ phân bổ vẫn thuộc về chính và không có quá trình nào khác có thể truy cập (ý tôi là, can thiệp vào) nó từ bên ngoài. Tôi có đúng không? (2) Tôi có phải giải phóng mảng (được phân bổ trong "f1") trước khi chương trình chấm dứt (hoặc nó được giải phóng ngay sau khi chương trình chính chấm dứt)? (3) Nếu câu trả lời cho câu hỏi thứ hai là "có" thì làm thế nào để bạn giải phóng một mảng được phân bổ trong một chức năng khác?
lưu ý: Tôi muốn ở trong ranh giới của thuần túy c và không được chuyển sang C++.
char *f1 (...) {
...
...
char *fTmp = malloc (length1 * sizeof (char));
char *fData = malloc (length2 * sizeof (char));
...
...
free (fTmp);
return (fData);
}
int main() {
char *fData = f1 (...);
...
return (0);
}
Tôi đã làm điều tương tự; tức là, tôi giải phóng mảng trong một quá trình đã được tạo trong một tiến trình khác ** bằng cách sử dụng con trỏ được truyền qua **. Tôi không chắc chắn những gì tôi đã làm là đúng cách. Vì vậy, cách tiếp cận của bạn có vẻ là câu trả lời gần nhất: "Thật tốt khi ai phân bổ bộ nhớ cũng giải phóng nó. Nếu không thể thì người gọi sẽ chịu trách nhiệm về trí nhớ như vậy". – ssd
@ merkez3110 nhưng bạn không thể chia sẻ con trỏ giữa các quy trình (trừ khi bạn đang chạy trong một môi trường không có bộ nhớ ảo được bảo vệ). –
Xin lỗi vì đã sử dụng thuật ngữ sai: "quy trình". Trong bình luận của tôi ở trên, tôi thực sự có nghĩa là "chức năng" khác nhau trong cùng một chương trình, không phải các quá trình khác nhau. Cảm ơn mọi người. – ssd