2016-11-06 60 views
0
class test{ 
    int value; 
}; 
class sample{ 
    sample(){ 
    test *var = new test(); 
    } 
}; 

int main(){ 
    sample foo; 
    //what will happen here if sample constructor fails to allocate its memory? 
} 

在C++構造函數中使用new運算符是否正確? 如果sample構造函數未能分配其內存,會發生什麼?在C++構造函數中使用new運算符是否正確?

+2

將引發異常。 – StoryTeller

+0

...或返回nullptr –

+3

@EdHeal,這不是'std :: nothrow'重載調用,並且'operator new'不會超載。所以一個例外,絕對是一個例外。 – StoryTeller

回答

2

如果樣本構造函數未能分配內存,會發生什麼?

它會拋出一個異常std::bad_alloc,可以在main()通過捕捉它來消毒:

int main() { 
    try { 
     sample foo; 

     // Work with foo ... 
    } 
    catch(const std::bad_alloc& ba) { 
     std::err << "Not enough memory available. Caught 'bad_alloc' exception: '" 
       << ba.what() << "'" << std::endl; 
    } 
} 
0

new會失敗時拋出一個異常bad_alloc

當一個構造函數以異常退出時,該對象永遠不會到達構建點。它的析構函數不運行。

如果異常在構造函數體內拋出,則所有對象的成員變量都會被銷燬(通過析構函數調用)。如果異常是從成員的構造函數中拋出的,則會運行前面的成員的析構函數。重點是撤銷構造函數迄今爲止所做的任何操作,不多也不少。

這裏不應該有任何臭味。請注意,成員析構函數將始終表現正常。這可能涉及對類不變量更挑剔。 C++想要照顧特殊的情況,所以你不需要寫很多角落案例......但另一方面,角落案例仍然存在,隱含和不言而喻。

相關問題