在我的项目中,我找到了一段代码,其中一个方法在构造函数的初始化列表中被调用.
Test2(Test* pTest):m_pTest(pTest), m_nDuplicateID(pTest->getTestID()) { }
我发现Test2的用户可能会将NULL传递给构造函数.由于指针在未经验证的情况下使用,因此存在访问冲突的可能性.
这引发了我在构造函数的初始化列表中查看异常处理.我在其中一篇文章中发现尝试可以在初始化列表中使用.我写了一个小测试程序来测试这个概念:
//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++标准.在这种情况下,我们如何处理构造函数初始化列表中的异常(标准处理方式)?
谢谢.
C++标准第15/3节
函数try-block将handler-seq与operator-initializer(如果存在)和function-body相关联.在ctor-initializer中执行初始化表达式期间或在函数体执行期间抛出的异常将控制转移到function-try-block中的处理程序,其方式与执行try期间抛出的异常相同-block将控制权转移给其他处理程序.
class C { int i; double d; public: C(int, double); }; C::C(int ii, double id) try : i(f(ii)), d(id) { //constructor function body } catch (...) { //handles exceptions thrown from the ctor-initializer //and from the constructor functionbody }
首先,如果你取消引用NULL指针,标准C++不能保证会抛出异常,所以你的代码对于这种情况是没用的.
其次,如果抛出异常,你的异常处理程序会做什么?
第三,构造函数/函数异常块被广泛认为是时间的流逝 - 看看http://www.gotw.ca/gotw/066.htm以及Herb Sutter的GotW站点上的其他文章.