내 프로젝트에서 생성자의 초기화 목록에서 메서드가 호출되는 코드 조각을 발견했습니다.생성자의 초기화 목록에서 예외 처리
Test2(Test* pTest):m_pTest(pTest), m_nDuplicateID(pTest->getTestID())
{
}
Test2의 사용자가 NULL을 생성자에 전달할 가능성이 있음을 확인했습니다. 유효성 검사없이 포인터가 사용되므로 액세스 위반 가능성이 있습니다.
이렇게하면 생성자의 이니셜 라이저 목록에서 예외 처리를 조사하게됩니다. 나는이 기사에서 initializer 목록 내부에서 try를 사용할 수 있음을 발견했다.
//Test class stores the unique ID and returns the same with API getTestID
class Test
{
public:
Test(int nID):m_nID(nID){
}
int getTestID() const
{
return m_nID;
}
private:
int m_nID;
};
class Test2
{
public:
Test2(Test* pTest)
try :m_pTest(pTest), m_nDuplicateID(pTest->getTestID())
{
}
catch (...)
{
cout<<"exception cought "<< endl;
}
void printDupID()
{
cout<<"Duplicate ID" << m_nDuplicateID << endl;
}
private:
Test* m_pTest;
int m_nDuplicateID;
};
int main(int argc, char* argv[])
{
Test* pTest = new Test(10);
Test2 aTest2(pTest);
aTest2.printDupID();
delete pTest;
return 0;
}
가이 코드는 VC6.0 컴파일 점점되지 않은 : 나는이 개념을 테스트하는 작은 테스트 프로그램을 썼습니다. VC 6.0에서 컴파일되도록 변경해야합니까?
또한 기사 중 하나에서 생성자의 이니셜 라이저 목록에서 try를 사용하면 엄격하게 C++ 표준을 확인하지 않는다는 것을 발견했습니다. 이 경우 생성자의 initializers 목록 (표준 처리 방법)에서 예외를 처리하는 방법은 무엇입니까?
감사합니다.
VC6은 표준 C++ 호환이 아닌 것으로 악명이 높습니다. –