2013-05-10 36 views
9

我使用的dynamic_cast在我的源投指針像下面的一些事情,dynamic_cast在與指針一起使用的情況下會拋出異常嗎?

Base *base = here storing the pointer; 

Derived *derived = dynamic_cast<Derived*>(base); 

在基地的情況下,不具有類層次結構的指針,然後轉換失敗,返回NULL。在接下來的幾行中,我檢查NULL。所以沒有問題。

我遇到了崩潰轉儲,由於dynamic_cast拋出異常,我的應用程序崩潰。

我知道dynamic_cast只會在與引用類型一起使用時拋出。

任何想法dynamic_cast可以拋出異常時使用指針,因爲我在上面的源使用? enter image description here

+0

重複的[http://stackoverflow.com/questions/278429/what-c​​ould-cause-a-dynamic-cast-to-crash] – prasadmadanayake 2016-06-20 04:41:28

回答

4

dynamic_cast<Derived*>可以拋出,如果傳遞給它(base)的指針是無效的,因爲dynamic_cast需要取消對它的引用,以瞭解其動態類型。

編輯:更具體。當與指針一起使用時,dynamic_cast永遠不會拋出結構化異常(例如std::bad_cast),但它可能會拋出一個非結構化異常,當傳遞無效指針時您無法捕捉到異常。使用無效指針會導致未定義的行爲,在這種情況下通常意味着訪問無效內存和崩潰。

根據你已經附加到你的問題的內存轉儲,很明顯,pInfo指向一個無效的對象,因此所有這些<Memory access error>消息。這意味着pInfo是無效指針,這就是程序崩潰的原因。你有一個地方的錯誤,你將不得不修復它。

+0

根據我的分析,我開始知道,在無效的情況下它給NULL的指針。它什麼時候可以讓異常返回NULL。你能否就這裏的無效指針給出你的意見。 – 2013-05-10 06:59:04

+0

@RajeshSubramanian無效指針是一個指向一個對象的指針,也不爲空。如果'base'指向一個被破壞的對象,或者沒有被初始化爲一個對象的地址,那麼它是無效的。 – Gorpik 2013-05-10 07:14:16

+0

在我從crashdump的情況下,我發現該對象不是null;因爲在這個強制轉換之前,我有一個檢查null的條件。 – 2013-05-10 07:48:21

11

任何想法,當dynamic_cast可以拋出異常與指針一起使用時,我在上面的源中使用?

在明確的程序中,它不能。該標準不允許它:

[C++11: 5.2.7/9]:失敗強制轉換爲指針類型的值是所需的結果類型的空指針值。失敗的轉換爲引用類型投擲std::bad_cast(18.7.2)。

但是,如果傳遞dynamic_cast無效的指針,然後調用未定義行爲任何可能發生,包括一些實現定義的C++異常,或運行時崩潰。

相關問題