2008-10-11 3 views

답변

13

메모리를 malloc 또는 다른 메모리 할당자를 사용하여 동적으로 할당했다고 가정하면 free을 사용하여 메모리를 해제합니다. 메모리가 정적으로 할당 되었으면 해제 할 수 없습니다.

+0

저주! 다시 망 쳤어!표준 라이브러리 함수 중 일부는 malloc 또는 calloc을 호출하고 호출자에게 메모리를 해제해야한다는 점에 유의하십시오. – dmckee

+0

@dmckee : 반환 할 블록을 free() 할 것을 요구하는 타사 또는 플랫폼 API가있을 수 있지만 (malloc, calloc 및 realloc과 같은 할당 라이브러리 이외의) 표준 라이브러리 함수는 인식하지 못합니다. 이 작업을 수행. –

1

정말 당신이 당신의 변수 선언 방법에 따라 달라집니다 - 그것은 일반 변수의 경우 "할당 해제는"이 메모리의 기운 - 그것은 여기처럼 범위에서 얻을 때 출시됩니다

for (int i=0;i<10;i++) { 
int k=i; 
//do stuff 
} 

나는 것 루프를 종료하면 할당이 취소되고 k는 루프 본문을 통과 할 때마다 할당되고 할당이 해제됩니다. 이 런타임 메모리 할당에 대해이되면

당신은

int* intArray; 
malloc(200 * sizeof(int)); 

이 당신에게 (200) int 배열을 줄 것이다 믿음직한의 malloc 무료 :)를 사용할 수 있습니다.

1

당신은, 수 당신이 malloc을 사용하지 않는 가정하고, 문자열을 만들거나

char array[100]; 

를 사용하여 버퍼하지만 당신은 당신은 단지 긴 기능의 아주 짧은 부분을 사용하고 있는지 알고 함수의 일부분을 다른 {} 집합에 배치하십시오.

int reallylongfunction() { 
    // Do a lot of stuff 
    { 
     char stringbuffer[100]; 
     // Do stuff with the buffer... 
     // Ok, we're done with the buffer, and don't want it anymore 
    } 
    // Do a lot more stuff 
    return; 
} 

이렇게하면 버퍼가 범위를 벗어나서 해제됩니다. 조심해라. 여분의 {} 안에 선언 한 다른 것은 범위를 벗어나 사라질 것이다!

편집 : 저주, 의견이 맞습니다. 범위를 벗어나는 정적 문자열은 아무런 효과가 없습니다. 수정되어 단지 배열에 불과합니다.

+0

제안 된 코드는 "string"변수가 4 또는 8 바이트를 저장하는 범위를 벗어날 경우에만 발생합니다. C 표준 (6.4.5.5)에 따르면 문자열의 값은 정적 저장 기간의 배열이므로 효과적으로 영구적으로 할당됩니다. –

+0

글쎄 실제로 거기에 문자열의 두 복사본을 가지고 있으며, 그들 중 하나만 함수를 반환 wheund 릴리스됩니다 (_maybe_ 일찍). 방금했다면 : static const char mystr [] = "..."; 괜찮은 컴파일러는 코드에 하나의 버전을 넣을 것입니다 (절대로 사라지지 않을 것입니다). –

0

ustr은 자동으로 일정하고 동적으로 할당 된 문자열과 함께 사용할 수있는 문자열 API입니다. 두 개 중 실제로 두 개 중 하나만 "자유롭게"할 수 있지만 모두 같은 방법으로 취급하고 ustr_free()에 전달할 수 있습니다.

스택, 힙 및 데이터 (RO 텍스트 문자열)가 "할당"및 "해제"되는 방법에 대해 배우고 싶지만 도움이되는 학습을하는 동안 사용 가능한 API를 사용하면 당신은 많이 (그리고 당신이 당신 스스로하는 것보다 훨씬 더 빠를 것입니다).

1

이 질문은 더 이상의 정보가 없으면 대답 할 수 없습니다. 객체를 해제하는 방법을 알 수있는 유일한 방법은 객체가 어떻게 할당되었는지를 아는 것입니다.

그리고 객체, 난 그냥 C++ '객체',하지만 '객체'는 C 표준에 사용되는하지 의미 말할 때 :

영역 실행 환경에서 데이터 저장을 내용 값을 나타낼 수 있습니다.

관련 문제