Java和C#以及可能還有其他許多語言都有一個預定義的異常類,當使用null參數時它將不會引發。 C++中有類似的東西嗎?如果沒有,是否有另一個預定義的例外,我可以使用或者我應該定義我自己的嗎?是否存在C++等價的NullPointerException
回答
取消引用NULL指針在C++中是未定義的行爲 - 這意味着代碼可能看似工作。不能保證引發異常。您可以使用
異常(提供一個有意義的值給它 - "p is NULL"
),但你必須做的檢查自己。
謝謝,這是我正在尋找的答案。 –
通常,在C++(或C爲那件事),你從來沒有取消引用一個NULL指針。這樣做有未定義的行爲(可能是我知道的任何實現的段錯誤,但根據標準可能會發生任何事情)。這在其他語言中可能也是一件壞事,但我不知道那些足以說明這一點。
最好防止出現這種情況,而不是試圖從中恢復(無論如何C或C++都無法完成)。
了以往的模式,防止一些相關的編程錯誤是使用assert()
內部功能機構,如:
int foo(int* myint)
{
// Ensure myint is not NULL
assert(myint);
// Do something with myint
(*myint)++;
return *myint;
}
這種assert()
通話將被完全忽略的發佈版本,因此在生產沒有成本。他們只是幫助發展。在調試版本上,如果條件不滿足,程序會立即以非常明確的錯誤消息中止。通過調試器運行它,您可以輕鬆檢查調用堆棧以調查確切原因。
FTR,在C#中你不會使用NullReferenceException
s,除非你想被你的隊友刺傷。有一個ArgumentNullException
而不是拒絕空參數。 NRE是由運行時引發的,而不是你。
但是請注意,這對於斷言沒有任何實際優勢,因爲您不應該捕捉其中的一個:如果它們被拋出,它們會指示一個錯誤。這些就是Eric Lippert所稱的boneheaded exceptions,它們是你自己的缺點,你的代碼應該專門與他們做任何事情。
在C++ dereferencing空指針將導致未定義的行爲,大多數情況下應用程序與段錯誤結束。在Visual Studio中,您可以使用擴展,如結構化異常處理(SEH),它允許捕獲空指針解引用。
在幾乎所有涉及錯誤地使用空指針的情況下(特別是對其進行去擴展),C++標準只會使行爲不確定。沒有提供特定的異常類型(並且不會拋出異常)。
雖然這個規則有一個可能的例外。std::function
,這是可以用來包裝功能的C++ 11個標準庫模板,可以分配一個空指針:
std::function<void(int)> func = nullptr;
如果您隨後試圖通過調用由它包裹的功能它會爲func(arg);
做一些自變量arg
,它會拋出一個std::bad_function_call
異常。
當然,這並不完全等同於其他語言的空指針異常,因爲它通常不太適用。
C++中沒有用於解引用NULL指針的標準異常。
如果你想要它,你可以自己實現它。在UNIX上設置一個SIGSEGV信號處理程序並從處理程序中引發異常。在Windows上,使用_set_se_translator()API來安裝「結構化異常」處理程序。
- 1. 在C++/CLI中是否存在C#的不安全等價物?
- 2. 是否存在與$ http.pendingRequests等價的Angular2?
- 3. 是否存在0x80的ascii等價物?
- 4. 是否存在與SELECT ... COUNT(*)... GROUP BY ...等價的等價物?
- 5. 在C++中是否存在C#SecureString等價物?
- 6. C++中是否存在Python中的「in」函數的等價物?
- 7. WeakHashMap是否存在java.util.concurrent等價物?
- 8. Axiis是否存在非Adobe等價物?
- 9. JavaScript中是否存在getColorBoundsRect()等價物?
- 10. IBM Worklight - 是否存在Window.open()等價物?
- 11. Flex中是否存在C#的Path.GetExtension等價物?
- 12. 是否存在JavaScript方法encode()的Objective C等價物?
- 13. 在C#中是否存在boost :: shared_ptr <T>等價物?
- 14. 在C#Windows窗體中是否存在QTimer :: singleShot等價物?
- 15. 是否有C#等價於PHP的array_key_exists?
- 16. 是否有一個C#等價於m_nCmdShow?
- 17. Pascal的readkey是否等價?在C或C++?
- 18. 是否存在與BCEL(Java .class操作)等價但在C或C++中
- 19. 在Java中是否存在C#mstest系統屬性的等價物?
- 20. 在MS-SQL中是否存在與SHA1()等價的內容?
- 21. 在Windows上是否存在NSOperationQueue的等價關係?
- 22. 在javascript或node.js中是否存在等價的std :: bind?
- 23. 在GAE(python)中是否存在等價於Rails的「flash」消息?
- 24. 在Python 3中是否存在與tokenize import pseudoprog.match的等價物?
- 25. 在Ruby 1.8.5中是否存在Array#each_slice()的等價物?
- 26. 在PowerShell中是否存在「this」的等價物?
- 27. 在jQuery中是否有等價的eval()?
- 28. 是否存在pythonic的「if __name__ ==」__main__「:main()」的R等價物?
- 29. 它是否存在Java的Wicket的Ruby等價物?
- 30. 是否存在與SQL Server的OUTPUT INSERTED *等價的Oracle?
分割錯誤。 – kmkaplan
FTR,在C#中,除非你想被你的隊友刺傷,否則你不會使用NullReferenceExceptions。 –
在C#中,我使用了一個ArgumentNullException,我的隊友總是對我很好。 –