2009-08-26 28 views
10

Rất nhiều liên quan đến my previous question, nhưng tôi thấy đây là vấn đề riêng và không thể tìm thấy câu trả lời chắc chắn cho vấn đề này.Bộ nhớ của mảng (ký tự) có được giải phóng bằng cách thoát khỏi phạm vi không?

Bộ nhớ có được sử dụng bởi mảng (ký tự) được giải phóng bằng cách thoát khỏi phạm vi không?

Một ví dụ:

void method1() 
{ 
    char str[10]; 
    // manipulate str 
} 

Vì vậy, sau khi cuộc gọi method1, là bộ nhớ được sử dụng bởi str (10 byte) giải thoát, hay tôi cần phải dứt khoát gọi miễn phí về vấn đề này không?

Trực giác của tôi cho tôi biết đây chỉ là một mảng đơn giản của các loại nguyên thủy, do đó, nó tự động được giải phóng. Tôi nghi ngờ vì trong C bạn không thể giả định bất cứ điều gì để được tự động giải phóng.

Trả lời

18

Trong trường hợp này, bạn không cần phải gọi miễn phí. Giá trị "str" ​​là giá trị dựa trên stack sẽ được xóa khi phương thức/phạm vi cụ thể đó được thoát.

Bạn chỉ cần gọi miễn phí trên các giá trị được tạo rõ ràng thông qua malloc.

+1

(Trường hợp "không" có nghĩa là - vâng, miễn phí bằng cách thoát khỏi phạm vi và bạn không cần phải gọi miễn phí rõ ràng) – jmanning2k

+0

@ jmanning2k tôi đọc lại bài đăng của mình và chỉnh sửa một chút rõ ràng hơn về những gì "không" có nghĩa là – JaredPar

1

Không, biến cục bộ của loại này được cấp phát trên ngăn xếp, vì vậy khi bạn trở về từ quy trình, bộ nhớ có sẵn cho cuộc gọi hàm tiếp theo, sẽ sử dụng bộ nhớ cho khung ngăn xếp của nó.

Nếu bạn sử dụng malloc() không gian được phân bổ trên heap, mà phải được giải phóng một cách rõ ràng.

9

Nó tự động được giải phóng. Nếu bạn không bỏ qua nó, bạn không cần phải giải phóng nó. Nhưng điều này không liên quan gì đến việc nó là một "mảng đơn giản của các kiểu nguyên thủy" - nó sẽ được giải thoát nếu nó là một mảng các cấu trúc. Nó được giải phóng bởi vì nó là một biến cục bộ.

Vì bạn đang hỏi những câu hỏi rất cơ bản này, Tôi phải hỏi bạn đang sử dụng sách giáo khoa C nào. Cá nhân, tôi không tin rằng bạn có thể tìm hiểu C một cách hữu ích mà không cần đọc Kernighan & Ritchie The C Programming Language, trong đó giải thích tất cả những thứ này rất rõ ràng.

+0

Lời khuyên tuyệt vời! – Lazarus

+0

Tôi thực sự đọc (và nghiên cứu) Ngôn ngữ lập trình C của K & R, nhưng đó là một số thời gian trước và trước khi tôi thực sự "đi vào" C bản thân mình nhiều hơn một chút. – pbean

0

Tôi nghĩ rằng nó được giải phóng không phải vì đó là nguyên thủy nhưng đó là một biến địa phương và sẽ được phân bổ trên ngăn xếp không phải là đống. Nếu bạn không malloc nó sau đó bạn không thể miễn phí nó như xa như tôi nhớ.

0

Có, nó được "giải phóng" khi nó nằm ngoài phạm vi.
Không, bạn không phải giải phóng nó một cách rõ ràng.

Mảng char được cấp phát trên ngăn xếp, vì vậy khi bạn trở về từ hàm, không gian ngăn xếp đó có thể sử dụng lại được. Bạn không cần phải giải phóng bộ nhớ một cách rõ ràng.

Quy tắc chung: nếu bạn malloc, bạn phải free.

+0

Câu hỏi là về C, không phải C++ –

+0

Ah, vâng, thực sự. Hãy để tôi sửa lỗi đó. –

3

Có, nó được "giải phóng". (Tuy nhiên, không phải là tự do() ')

Vì str là một biến tự động, nó sẽ chỉ kéo dài miễn là phạm vi của nó, cho đến khi kết thúc khối chức năng.

Lưu ý rằng bạn chỉ miễn phí() những gì bạn malloc().

2

Có, bộ nhớ được giải phóng tự động sau khi trả về method1. Bộ nhớ cho str được cấp phát trên ngăn xếp và được giải phóng khi khung ngăn xếp của phương thức được dọn sạch. So sánh điều này với bộ nhớ được phân bổ trên heap (thông qua malloc) mà bạn phải hoàn toàn miễn phí.

0

Gần đây tôi hơi bị lỗi trong C/C++, nhưng tôi nghĩ bạn nói đúng. Miễn là bạn không tự động phân bổ bộ nhớ đó, bạn sẽ ổn thôi.

Các vấn đề liên quan