2011-09-23 4 views
2

현재 Visual C++는 malloc()__declspec(restrict)으로 장식 된 런타임과 함께 제공됩니다."다른 포인터에 의해 앨리어싱되지 않은 포인터"의 의미는 무엇입니까?

MSDN은 malloc()에 의해 반환 포인터 다른 포인터에 의해 별명을 할 수없는 컴파일러이 장식 상태를 말한다. 좋아, 두 번 연속해서 malloc()을 호출하면 별개의 포인터가 반환됩니다. 하지만 전화하면 어떻게 되나요?

void* memory1 = malloc(10); 
free(memory1); 
void* memory2 = malloc(10); 
//here memory1 may be equal to memory2 

이 경우 두 포인터는 매우 동일한 위치를 가리킬 수 있습니다. 이 값과 의 상관 관계는 다른 포인터에 의한 별칭이 될 수 없습니다 의미는 __declspec(restrict)입니까?

+1

나는 그 질문을 이해하지 못한다. 여기서 앨리어싱이 없으며 free'd는 더 이상 존재하지 않습니다. Dereferencing'memory1'은 기술적으로 UB가 될 것입니다. – Mat

+0

@Mat : 대답처럼 보입니다. – sharptooth

답변

3

표준은 "개체 수명"(N3290에서 §3.8)에 대한 대답이 있습니다

타입 T의 객체의 수명이 끝날 때 :
- T는 클래스 유형이 함께있는 경우 중요하지 않은 소멸자 (12.4), 소멸자 호출이 시작되거나
- 개체가 차지하는 저장소가 다시 사용되거나 해제됩니다.

free '블록이 memory1에 의해 가리킨 다음 해당 개체가 죽었습니다. 그것은 존재하지 않게되었습니다. 해당 포인터를 Dereferencing하면 정의되지 않은 동작이 발생합니다.

memory2에는 동일한 메모리 주소가 할당 될 수 있지만 "별칭"으로 지정되지는 않았습니다. 그 위치의 주소는 모두 사라졌습니다.

4

일단 free (memory1)를 사용하면 memory1 포인터를 통해 액세스하는 것은 정의되지 않은 동작 (비강 악마 등)이므로 컴파일러는 memory2가 malloc 뒤에 다른 포인터에 의해 별칭이 지정되지 않는다고 가정하여 최적화 할 수 있습니다) 전화.

이 문제는 컴파일러 자체가 malloc()의 의미에 대한 내부 정보가 없다는 것을 전제로합니다. 즉, 다른 함수와 마찬가지로 취급합니다. 반환 된 포인터가 anyallis에 의해 별칭이 지정되지 않는다고 가정 할 수 없습니다. 다른 포인터. __declspec(restrict) (또는 이와 동등하게 GCC의 __attribute__((malloc)))은 포인터가 다른 포인터에 의해 별칭이 지정되지 않았 음을 컴파일러에 알려주므로 다른 방법으로는 가능하지 않은 최적화가 가능합니다.

+0

"일단 (메모리 1)을 비우면 memory1 포인터를 통해 아무 것도 액세스 할 수 없으므로 ...": 실제로 허용되며, 정의되지 않은 동작이 발생합니다. IMHO는 다른 것을 의미합니다. "컴파일러는 memory2가 malloc() 이후에 별칭이 지정되지 않는다고 가정하고 최적화 할 수 있습니까?" 그게 확실하지 않습니다 : "앨리어싱"은 무엇입니까? 방금 할당되었습니다! –

+0

@ Emilio : 충분히 공정하고 고정되어 있습니다. – janneb

+0

@Emilio : 귀하의 수정 된 의견을 이해할 수 없습니다. 설명해 주시겠습니까? – janneb