檢查空引用?
回答
你不能後期初始化那樣的參考。它在聲明時必須初始化。
在VISUAL C++,我得到
錯誤C2530: 'REFINT':引用 必須初始化
與您的代碼。
如果您「修復」了代碼,崩潰(嚴格來說,未定義的行爲)會在VC++ v10中的參考使用時間發生。
int* foo = 0;
int& refint(*foo);
int i(refint); // access violation here
確保安全的方法是在參考初始化或分配時檢查指針。
int* foo =0;
if (foo)
{
int& refint(*foo);
int i(refint);
}
但仍不能保證foo
點的可用內存,也不是說這仍然如此,而引用的範圍。
「崩潰將在參考初始時發生」 - 承諾? ;-) – 2010-11-24 19:18:46
崩潰不需要(並且通常不會)在參考初始階段發生。 UB可能會發生任何事情,包括沒有崩潰。 – 2010-11-24 19:18:53
你沒有,當你有一個「空」的引用你已經有未定義的行爲。在嘗試通過解引用指針來形成引用之前,應該始終檢查指針是否爲空。
(你的代碼是非法的;你不能創建一個未初始化的參考和嘗試,並通過賦予其綁定;你只能在初始化過程中綁定。)
一般情況下,你不能。
無論誰「創建空引用」(或試圖,我應該說)已經調用了未定義的行爲,因此代碼可能(或可能不會)崩潰,然後您有機會檢查任何內容。
誰創建的參考應該做的:
int *foo = 0;
if (foo) {
int &refint = *foo;
... use refint for something ...
}
通常它被認爲來電者的問題,如果他們寫*foo
時foo
是空的,它不是一個函數有責任爲您在那種錯誤的其他功能的代碼。但是你可以通過你的代碼扔掉像assert(&refint);
這樣的東西。他們可能會幫助您發現您的呼叫者所犯的錯誤,因爲畢竟您寫的任何功能對您來說都是合理的機會。
您不需要,引用不能爲空。
閱讀說明書。
爲了使上面的代碼編譯,你將不得不切換順序:
int* foo =0;
int& refint = *foo; // on actual PCs, this code will crash here
(有可能是舊的處理器或運行時的架構,其中這個工作。)
....說以上所有的,如果你做想有一個空引用,使用boost::optional<>
,就像一個魅力..
所有的答案以上是正確的,但如果由於某種原因,你想這樣做,我想至少有一個人應該提供答案。我目前正在試圖追蹤某些源代碼中的錯誤引用,並且看看是否有人刪除了此引用並在某個時刻將其設置爲null會很有用。希望這不會導致許多反對票。
#include <iostream>
int main()
{
int* foo = nullptr;
int& refint = *foo;
if(&refint == nullptr)
std::cout << "Null" << std::endl;
else
std::cout << "Value " << refint << std::endl;
}
輸出:
空
- 1. 檢查空引用
- 2. 行檢查爲空的空引用異常?
- 3. 如何檢查空的獲取索引?
- 4. 空檢查引發NullPointerException異常
- 5. 空檢查C + +
- 6. 空檢查
- 7. PHP檢查空
- 8. 空值檢查
- 9. 檢查空列
- 10. 空檢查
- 11. 檢查空值
- 12. 用HtmlAgilityPack檢查爲空
- 13. 檢查索引
- 14. 檢查二進制引用
- 15. 檢查PHP引用鏈接
- 16. 儘管檢查爲NULL,但爲空引用異常
- 17. 有沒有可以檢查空引用異常的工具?
- 18. 爲什麼我不需要檢查引用是否無效/空?
- 19. PHP函數檢查瀏覽器引用是否爲空?
- 20. 空reference.cs文件中添加服務引用檢查
- 21. 如何檢查散列引用在perl中是否爲空
- 22. C#代碼契約 - 避免檢查空引用的參數
- 23. 檢查對象爲空,則檢查是否該對象保持不空引用到另一個對象
- 24. 使用mysql查詢檢查空結果
- 25. 什麼時候處理空指針/引用異常首選做空檢查?
- 26. 空檢查vs可選存在檢查
- 27. 檢查空查詢集
- 28. LINQ查詢檢查爲空
- 29. 檢查DataGridViewComboBox是空
- 30. 檢查JavaScript空值
遊曳誰寫的開發商是進入一個黑暗的房間有一把椅子和一個光芒照耀其上。然後你用香菸焚燒他們,直到他們悔改。 – 2010-11-24 20:06:46