2011-04-28 6 views
2

프리 머 티브 또는 프리미티브 배열을 선언하고 있습니다 (스택 오른쪽에 있음). 메모리를 가져 가지 않거나 누출시키지 않도록 "무료"또는 정리하는 방법은 무엇입니까? 예를 들어메모리, 프리미티브 및 C

:

int blah; 
blah=7; 
doSomethingWithBlah... 
free(blah) //[?] 
아마

보통이 아닌 비트 거래; 하지만 거대한 문자 배열이나 뭐라고 말하면 어떨까요?

또한 '로컬'변수 (즉, 함수 내부)는 기본적으로 '자동'이며 자동으로 정리됩니다. [Java에서는 스코프를 벗어날 때 GCed입니다.

그냥 고맙습니다. 고마워요.

답변

1

그렇지 않습니다.

스택은 데이터 구조입니다. LIFO (Last In, First Out)는 스택에 마지막으로 놓인 것이 스택에서 제거 될 첫 번째 것을 의미합니다. 다음은 프로그래밍이 생각하는 방법은 다음과 같습니다

주 -> foo는

주요 기능 (진입 점) 일부 함수 foo를 호출합니다. 특정 변수는 main 함수에서 선언/정의됩니다. 다른 것들은 범위가 다른 foo 함수에서 선언됩니다.

프로그램에 들어가면 main에 선언 된 모든 변수가 스택 블록에 푸시됩니다. 호출 될 때 foo와 같지만 그 다음 블록.그런 다음 foo 함수의 끝에 도달하면 스택에서 해당 변수 세트를 팝합니다 (또는 '해제'). main 함수의 끝에 도달하면 스택에서 해당 변수 세트를 팝합니다.

질문에 대답하기 위해 스택에 저장된 로컬 배열을 포함하여 모든 로컬 변수가 범위를 벗어날 때 자동으로 삭제됩니다. 당신은 그 자신을 해방 할 필요가 없습니다.

C에서 "malloc"을 사용하거나 C++에서 "new"를 사용할 때마다 힙에 넣는 것에 대해 걱정할 필요가 있습니다.

+1

이것은 내가 아는 세부 사항이며, 필자가 작성한 내용이 정확하다고 생각합니다. 내가 잘못한 부분을 바로 잡아 주시거나이 주제에 대한 지식을 향상시키지 못한 정보를 좀 더 제공해주십시오. –

+0

감사합니다. 약간의 질문. 글로벌 바는 어떨까요? (또는 결코 범위를 벗어날 수없는 하나). 수동으로 해제 할 수있는 방법이 있습니까? 이론적으로 당신은 거대한 char 배열을 할당하여 ascii 파일을 저장한다고합니다. 당신이 그것을 사용하여 (그리고 그것이 범위를 벗어나지 않을 것이라는 가정하에) 끝내면 어떤 방법으로 그것을 청소할 수 있습니까? 이론적으로 그것은 내가 생각하는 힙에 있어야합니다. – user697111

+0

내가 아는 한, 글로벌 vars는 프로그램이 종료 될 때 단순히 범위를 벗어날 것입니다. 나는 그들이 스택에 저장되지 않는다고 생각하지만. 데이터/메모리의 특정 부분이 글로벌 바스 전용이라고 생각합니다. 여기에 대한 자세한 내용은 http://annwm.lbl.gov/~leggett/vars.html을 참조하십시오. –

1

스택 프레임이 파괴 될 때 (즉 함수가 반환 될 때) 스택의 로컬 변수는 존재하지 않습니다. 스택 프레임이 아직 존재하는 동안에는 제거 할 방법이 없습니다.

큰 배열이 필요한 경우 malloc()을 사용하여 힙에 할당해야하므로 완료 할 때 free() 수 있습니다. (포인터 배열에 액세스하는 데 사용되는 변수는 스택에 남아 있지만 크기는 작습니다.)

1

스택에서 데이터를 "지우거나" "비우지"않으므로 메모리를 사용할 수 있으므로 필요가 없습니다 함수가 반환되면 다시 사용하십시오. 따라서 blah은 "정리"해서는 안됩니다. 그러나 함수가 반환되면 참조를 전달할 수 없습니다.

+0

뭐라구? – user697111

+0

@ user697111 : 스택에 할당되지 않았습니다. (프로그램의 * data * 세그먼트에 저장됩니다) –

1

C가 스택에 선언 한 지역 변수가 할당됩니다. 함수의 활성화 레코드의 일부로 사용되므로 함수가 반환 될 때 교정됩니다.

스택에 선언 된 데이터를 "무료"로 사용할 수있는 방법이 없다고 생각합니다.

1

수 없습니다. 스택 변수는 범위를 벗어나면 (포함하는 블록의 끝에서) "해제"됩니다.

큰 구조체/배열/등 힙에 malloc.

"Java 용어로는 범위를 벗어날 때 GCed입니다" ... 이것은 잘못된 것이며 사안을 생각하는 나쁜 방법입니다. java의 모든 오브젝트는 힙에 작성되며 나머지 참조가 없을 때 가비지 콜렉터에서 사용 가능하게됩니다. 이것은 스택에서 물건을 만들고 호출자에게 (잘못) 포인터를 반환 할 수있는 C와 매우 다릅니다.