2010-04-29 2 views

답변

2

아니요. 메모리를 0으로 설정하면 해당 메모리에 대한 포인터에 아무런 영향을 미치지 않습니다. 물론 메모리가 해제 된 후에는 메모리를 제로화 할 수 없습니다.

2

null 포인터는 메모리 위치를 가리 키지 않음을 나타냅니다. 따라서 메모리 위치를 가리키는 한, 그 메모리 위치에 넣을 수있는 것은 아무것도 없으며, 이는 메모리 위치를 가리킨다는 사실을 변경합니다.

이것은 null 세트와 빈 세트의 차이점입니다. 내가 쿠키 한 병을 비우는 경우, 나는 여전히 쿠키 한 병 (빈 세트)을 가지고 있습니다. null을 가지려면 항아리를 완전히 없애야합니다. 항아리의 내용에 내가하는 일로 항아리가 있다는 사실이 바뀌지 않습니다.

tl; dr : no

+0

마지막 단락은 무엇을 의미합니까? –

+0

@greg tl; dr = 너무 길거나 읽지 않았습니다. – frankc

+0

기술적으로 당신이 비우면 쿠키 한 병을 가지지 않을 것입니다. 쿠키 병을 가지고있을 것입니다 - 제 6yo 아들과 4yo 딸은 최근 이것에 대해 오랜 토론을 가졌습니다. 그것은 합의였습니다 :-)하지만 그것은 좋은 비유. – paxdiablo

1

포인터는 단지 주소입니다. 주소가 0이면 대부분의 시스템에서 널 포인터입니다. 포인터가 null인지 확인하기 위해 검사 할 때 포인터에 의해 참조 된 주소에 저장된 데이터는 어떤 방식으로도 액세스되지 않습니다. 이 데이터는 포인터가 참조 해제 될 때 메모리에서로드됩니다.

5

자신의 실수에서 자신을 보호하기보다는 미래에 동일한 실수를 다시하지 않도록 배울 수있는 방법이 있습니까? :-)

NULL에 대한 포인터를 설정하는 등의 모든 일들은 그 뒤에있는 메모리가 해제 될 때나 "안전한"문자열 함수를 사용하는 것과 같이 안전하지 않은 것으로 간주되는 것을 사용할 수 있다고 생각합니다. 그들이하는 일을 아는 사람들의 손에 완벽하게 안전합니다.

내 제안은 사용하고 싶은 언어의 잡화를 배우거나보다 안전하다고 느끼는 언어로 이동하는 것입니다. 당신이 말하는 것은 참조 카운팅 같은 것이고 많은 언어가 있습니다 (Objective-C 스프링이 마음에 듭니다).

그러나 C에서 코드를 작성하려고하거나 을 익히면 어두운면을 포함하여 언어를 익히십시오. 더 나은 코더가 될 것입니다.

: 여담으로


, 난 당신이 한 뒤에 메모리를 해제하는 경우, 모든 별명이 자동적으로 NULL로 설정됩니다, 그래서 당신을 위해 무엇을 요구하는지 것은 포인터의 별칭을 추적 할 수있는 방법이라고 생각

char *x = malloc(50); 
char *y = x; 
free (x); 
// Both x and y are now magically set to NULL. 

당신은 할당 된 블록에 대한 포인터를 (수동 또는 일부 GCC와 같은 게으른 바인딩 속임수를 사용) 즉, 절편의 malloc에서 C로 간접의 형태를하고 그래서, 대신에 반환하여이 이것을 달성 할 수 , 할당 된 블록에 할당 된 포인터에 대한 포인터를 반환합니다.

free 호출은 블록을 해제하지만 할당 된 포인터 (NULL로 설정 됨)가 아닌 호출을 수정해야합니다.

char **x = mymalloc(50); 
char **y = x; 
myfree (x); 
// Both *x and *y are now magically set to NULL. 

그래픽 형태 : 코드 내에서 간접 작업이 두 번 indirections (대신 *x**x) 될 것

+---+ 
| x | -+ 
+---+ | +--------+  +------+ 
     +-> | tmp000 | ---> | data | 
+---+ | +--------+  +------+ 
| y | -+ 
+---+ 

당신이 myfree라고는 data가 해제 될 수 있지만 tmp000 포인터. x 또는 y을 사용하여 data에 도달했는지 여부에 상관없이 NULL로 설정되므로 오류가 발생합니다. 물론

,이 주위에 거짓말 포인터를 떠나는 문제와이 코드를 처음 본 괜찮은 C 코더가 아래로 당신을 추적하고 :-) 펄프로 이길 것이라고 추가 문제가


"포인터 거짓말"문제는 tmp000의 참조 횟수를 사용하여 해결할 수 있지만 char **y = mydup(x);과 같이 포인터의 모든 복사본을 추적해야합니다.

"펄프에 맞다"문제는 모든 의도와 목적으로 불용성입니다.

+0

_bloody_ 펄프, 정확하게 말하자면 : 저는 이제 my_free ((void **) & pointer);로 가득 찬 상속 된 코드를보고 있습니다. 그리고 엄격한 플랫폼에서 작동하도록하기 위해서 제 직업입니다. 맹목적으로 역 참조 형식의 포인터를 '안전'의 이름으로 말한 사람들은 (포인터를 잃어 버리기 때문에) lynched됩니다. –

관련 문제