2017-10-19 2 views
-1

무효화에 대한 참조를 확인할 수 있는지 알고 싶습니다. 내가 할 수 있다고 믿지만, 나는 잘 모르겠다. 이 관련, 나는 또한 다음과 같은 경우에 내가 포인터를 "역 참조"하고 있는지 알고 싶습니다null 또는 특정 유형의 값에 대한 참조를 확인할 수 있습니까?

struct Texture { int width; }; 

void useTexture(Texture& texture) 
{ 
    int a = texture.width; 
    //Exception thrown: read access violation. 
texture was nullptr. 
// When I hover the mouse over the argument it says "struct at null" 
} 

int main() 
{ 
    Texture* obj = nullptr; 
    useTexture(*obj); // This is using the dereference operator, 
         // but no exception is thrown here. 
} 

예외 만 useTexture() 함수에서 발생합니다. 이 경우 함수에 * obj 인수를 전달할 때이 위치에서 데이터를 읽지 않고 포인터를 전달할 때와 다른 방식으로 가정합니다. 따라서 역 참조 연산자를 사용하더라도 포인터를 실제로 참조 해제 했습니까? 나는 그렇게 생각하지 않는다.

또한 참조가 유효한 경우 useTexture() 함수를 체크인하는 방법이 있는지 알고 싶습니다. 디버거에서는 인수 위에 마우스를 가져 가면 구조체가 null이라고 말하며 예외를 throw하면 텍스처가 nullptr이라고 표시됩니다. 나는 텍스쳐가 포인터가 아니기 때문에 주소가 0x00이기 때문에 nullptr을 말하는 것으로 가정하고있다.

마찬가지로, 내가 할 경우 :

Texture* obj = (Texture*)0x80; 
useTexture(*obj); 

대신 말하는 "널에서 구조체는"그것이 데이터를 읽을 수 없다고하고, 예외를 던지는 때 "0x80으로에서 잘못된 메모리 액세스가"말한다. 이것은 내가 이해합니다.

내가하고 싶었던 것은 유효한지 검사하는 안전 검사를하는 것이 었습니다. 사람들은 참조가 null이 될 수 없다는 것을 기억하고 포인터를 가져 오도록 함수를 변경해야한다고 생각하고 nullptr과 같은 포인터 값을 검사 할 수 있다고 생각했습니다. 하지만 참조를 본 것에서는 주소도 있고 null 일 수도 있습니다. 참조가 포인터 인수로 변경하지 않고 유효한지 확인하는 방법이 있습니까? 참고 문헌 질문은 별도의 질문이지만 두 가지 질문을하고 싶지 않습니다.

편집 : 난 그냥 테스트, 나는 같은 것을 할 수 있다고 생각했다 대신 호출 사이트에서 nullptr 검사의

if ((Texture*)&texture == nullptr) return; 

합니다. 이 같은

답변

1

이렇게 뭔가 :

A * a = nullptr; 
A b = * a; 

는 C++로 정의되지 않습니다. 컴파일러는 a을 역 참조하여 이름없는 임시를 생성하기로 결정할 수 있기 때문에 이름이 지정된 변수를 만들지 않더라도 정의되지 않았습니다. 그래서이 진술 :

* a; 

또한 정의되지 않았습니다.

+0

첫 번째 경우에는 포인터가 들고있는 주소를 읽는 것입니다. 나는 그것이가는 것을 이해합니다. 역 참조 연산자를 사용할 때 참조로 전달할 때 다른 포인터와 마찬가지로 주소 값을 전송하기 때문에 역 참조하는지 여부를 의심합니다. – Zebrafish

+0

참조는 포인터가 아닙니다. –

+0

나는 callfunction (* obj)을 수행 할 때 역 참조를 전혀하지 않는다는 것을 알기 때문에 참조는 객체의 주소를 취한다. – Zebrafish

관련 문제