2010-01-10 2 views
2

예를 들어 while 루프 외부에서 메모리를 할당 할 때 메모리를 내부에서 해제 할 수 있습니까? 이 두 코드는 동일합니까?C 코드에서 메모리를 비우는시기는 언제입니까?

int* memory = NULL; 
memory = malloc(sizeof(int)); 
if (memory != NULL) 
{ 
    memory=10; 
    free(memory); 
} 


int* memory = NULL; 
memory = malloc(sizeof(int)); 
if (memory != NULL) 
{ 
    memory=10; 
} 
free(memory); 
+3

당신이 "문 경우"참조 – ChrisF

+0

"루프 동안 것은"수보다는 의미하지 않는다 'malloc'과'free'에 대한 래퍼 함수를 ​​작성하십시오. 그렇게하면 기본 구현을 변경하려는 경우 (예 : 더 빠른 메모리 할당 기능 사용), 두 줄만 변경하면됩니다 ('malloc' 및'free' 행). 그리고 코드 복제를 피할 수 있습니다. –

답변

4

예, 동일합니다. 할당이 성공하지 못한 경우 free()으로 전화하지 않아도됩니다.
주의 : memoryint에 대한 포인터이며 해당 메모리 블록에 무언가를 할당하려면 역 참조를해야합니다.

int* memory = NULL; 
memory = malloc(sizeof(int)); 
if (memory) 
    *memory=10; 
free(memory); 
memory = NULL; 
+0

아니요, 그것들은 동일하지 않습니다. 'malloc'가 실패하면, 한 버전은'free'를 호출하고, 다른 버전은'free'를 호출합니다. –

3

확실한 경우 한 번만 해제하면됩니다.

좋은 아이디어는 당신이 그것을 다시 free'ed 도착하면 그때는

+0

오, 이제 나는 남자 3 free page에 더 많은 관심을 기울 였으면 좋겠다. 내 코드는 객체를 해제하기 전에 NULL에 대한 검사로 흩어져 있습니다! –

+0

모두들 그렇습니다.하지만 아무도 malloc가 NULL을 반환하는지 확인하지 않습니다. –

1

예 중요하지 않습니다, 그것을 해제 할 때 항상 포인터 = NULL을 설정하는 것입니다. 중요한 것은 너무 한 번 무료입니다. (메모리 사용을 마친 후에)

1

우선 무엇보다도 한 번만 해제 할 수 있습니다. 따라서 루프 내부에서 자유롭게하고 싶다면 (질문에서 알 수 있듯이) 두 번째 해결 방법 만 올바른 방법 일 수 있습니다.

if 문 내부에서 해제하려면 두 솔루션 모두 기술적으로 정확해야합니다. 그러나 항상 사용하는 메모리를 해제하고 if 문 외부의 끝 부분에서 항상 메모리를 해제하는 것이 더 쉬운 방법입니다.

내 조언은 다음과 같습니다. 무엇을하려하든 : 항상 루프/if 문 외부에서 메모리를 확보하십시오 (더 이상 필요하지 않다고 가정). 보통 마지막으로 사용 된 함수의 끝에서 해제하지만 함수의 길이, 길이 등에 따라 달라집니다.

길을 찾아서 붙잡아보십시오. 쓸데없는 많은 두뇌 시간 (정말로 귀중하다)

4
int* memory = NULL; 
memory = malloc(sizeof(int)); 
if (memory != NULL) 
{ 
    memory=10; 
    free(memory); 
} 

이것은 충돌 할 것이다. 포인터를 메모리 위치 10으로 설정 한 다음 시스템에 메모리를 해제하도록 요청합니다. 비현실적인 주소 공간의 미친 세계에서도 0x10에서 시작한 메모리를 이전에 할당 한 것은 거의 없습니다. 또한, malloc이 실패한 경우 메모리가 할당되지 않았으므로 해제 할 필요가 없습니다.

int* memory = NULL; 
memory = malloc(sizeof(int)); 
if (memory != NULL) 
{ 
    memory=10; 
} 
free(memory); 

이것은 또한 버그입니다. malloc이 실패하면 포인터를 10으로 설정하고 메모리를 해제합니다. (이전과 같이). malloc이 성공하면, 즉시 메모리를 해제합니다. 즉, 메모리를 할당하는 것은 의미가 없습니다. 자,이 코드가 포인트를 얻기 위해 단순화 된 예제 코드이고 이것이 실제 프로그램에 존재하지 않는다고 생각합니까? :)

+0

+1 좋은 관찰! –

1

내가 따라 좋아하는 엄지 손가락의 일반적인 규칙이 할당 된 것과 같은 범위에있는 메모리이다.

관련 문제