일부 데이터 블록에 액세스하기 위해 포인터를 사용하는 코드가 있습니다. 드문 경우지만 데이터 블록의 일부 구성원이 비어 있고 결과적으로 포인터가 매달리게됩니다. 사실, 나는 올바른 포인터를 얻지 만 포인터로 무엇인가를하려고 할 때 프로그램이 충돌합니다.포인터가 매달려 있는지 확인하는 방법이 있습니까?
일반적인 조언은 이러한 유형의 사용을 피하는 것입니다. 그러나 슬프게도, 내가 사용하는 프레임 워크는 이러한 유형의 데이터 액세스 방법을 사용해야합니다.
어떤 작업을 수행하기 전에 포인터가 유효하지 않은지 "확인"할 수있는 방법이 있습니까? 포인터가 NULL과 같지 않은지 확인하는 것은 분명히 작동하지 않았습니다. 또한 시도 :
try
{
CString csClassName = typeid(*pMyPointer).name(); // Check error condition
// The line below fails due to dangling pointer (data block is not valid).
hr = pMyPointer->MyPointerMethod();
}
catch(bad_typeid)
{
return E_FAIL;
}
catch(...)
{
return E_FAIL;
}
올바른 방법입니까?
내 포인터가 클래스에 정적이어야합니다. 여전히 괜찮습니다. 스마트 포인터를 사용한다면? – Nikhil
그건 전혀 문제가되지 않습니다. 스레드 안전 문제를주의해야하지만 스마트 포인터와 원시 포인터는 다르지 않습니다. –
나는 그것이 중요하다고 생각하지 않는다. 귀찮게하는 유일한 방법은 프레임 워크가 사전 통지없이 포인터를 매달 수 있는지 여부입니다. 보시다시피, 스마트 포인터에서 원시 포인터를 추출하여 프레임 워크에 전달해야합니다. 포인터가 호출 후에도 유효한 상태를 유지하거나 유효하지 않으면 알릴 것입니다. 괜찮 으면 이동하십시오. – Septagram