什麼時候我們需要在C++中使用「assert」作爲指針,當它們被使用時,它們最常被實現的方式是什麼?在C++中使用「assert」指針
回答
通常情況下,您會使用一個斷言來檢查一個條件,如果爲false,則會在您的應用程序中指示一個錯誤。因此,如果在應用程序的某個時間點遇到一個NULL指針,那麼應該不會遇到,除非存在錯誤,否則斷言它。如果由於某些輸入無效而可能會遇到,那麼您需要進行適當的錯誤處理。
您不需要需要根本就在指針上使用斷言。這個想法是確保當它們爲空時解除引用指針時不會崩潰。
你可以用assert
做到這一點,但它不是一個非常專業的方式來處理這樣的錯誤,因爲它總是終止程序 - 如果用戶沒有,例如,保存了他們最近三個小時的價值數據輸入。
什麼應該做的指針是檢查它們的無效性和失敗優雅。換句話說,讓你的函數返回某種類型的錯誤或者什麼都不做(不是每個人都會同意這種方法,但是如果它被記錄的話它是完全可以接受的)。
在我看來,assert
是爲了捕捉開發過程中遇到的問題,這就是爲什麼你會發現assert在某些編譯器下沒有發佈版本的問題。它是而不是是防守編程的替代品。
至於如何做到這一點:
void doSomethingWithPointer (int *p) {
if (p != 0)
cout << *p << endl;
}
換句話說,即使你的 「合同」(API)指出你」:
#include <assert.h>
void doSomethingWithPointer (int *p) {
assert (p != 0);
cout << *p << endl;
}
但這會爲得到更好的完成不允許接收空指針,你仍然應該優雅地處理它們。一箇舊的報價:在你給予的內容上保守,在你接受的內容中自由的(換言之)。
另一方面,用戶工作的3小時崩潰和失敗比嘗試「解決」問題和破壞3周的問題更可取。 – 2009-12-10 00:25:19
@Anon,我相信會被「優雅」的一點所覆蓋:-)顯然你必須這樣做*正確*。如果它們在非調試代碼中被禁用,斷言不會幫助您的領域的軟件變得非常小。斷言是用於開發,而不是生產(除非你是那種只將調試代碼發送到現場的類型之一)。 – paxdiablo 2009-12-10 00:43:18
這就是宏在哪裏派上用場:斷言可能在調試模式下產生核心,在釋放模式下產生異常:) – 2009-12-10 14:31:55
ASSERT語句與「強制文檔」一樣偉大 - 也就是說,它們會告訴讀者一些關於代碼的內容(「這絕不應該發生」),然後通過讓它知道它們是否不成立來執行它。
如果它的東西,可能發生(無效的輸入,內存無法分配),這不使用斷言時間。斷言是只有的事情是不可能發生的,如果每個人都遵守先決條件等。
可正是如此做:
ASSERT(pMyPointer);
(如果有人想知道,allcaps ASSERT是Microsoft斷言宏,小寫assert是標準的C.) – 2009-12-10 00:36:59
我會用一個ASSERT其中一個空指針不會立即導致崩潰,但後來可能導致somethign錯誤這是很難被發現。
如:
ASSERT(p);
strcpy(p, "hello");
是有點多餘,它只是取代了致命的異常有一個致命的斷言!
但是在更復雜的代碼中,特別是像智能指針這樣的東西,知道檢查指針是否屬於你自己的東西可能是有用的。
記住ASSERT只能在調試版本中運行,它們在版本中消失。
根據經驗,如果你斷言空條件應該永遠不會發生在正常情況下,你的程序處於非常糟糕的狀態。從這種空狀態恢復將更有可能掩蓋原始問題。
除非你在代碼中考慮異常保證(linky)我說讓它崩潰,那麼你知道你有問題。
我會說:「在任何情況下都不應該發生」。 – 2009-12-10 07:39:47
在C,也有在調試模式下斷言功能.. ,如果斷言(X),X的條件是假的,會彈出一個警告... 但請記住它只能在調試模式下... 在釋放模式下,所有斷言函數全部被跳過
- 1. 在C中使用指針#
- 2. 在C中使用指針
- 3. 使用指針在C
- 4. 使用指針在C
- 5. 在C++中爲指針指定指針
- 6. 使在C++ **指針
- 7. 在「assert」中使用switch語句(C++)
- 8. 如何在c DLL中使用assert
- 9. 何時在C++中使用指針指針?
- 10. 在C中使用指針偏移量#
- 11. 在Objective-C中使用指針?
- 12. 在C中使用指針投射
- 13. 在C++中使用「this」指針
- 14. 在C++類中使用指針成員
- 15. 使用在c中有**的指針
- 16. 如何在C++中使用localtime_s指針
- 17. 爲什麼在C中使用指針?
- 18. 在C++中使用指針陣列
- 19. 指針在C指針
- 20. 如何在C#中做「指針指針」?
- 21. 如何使用指針指向c#中的指針?
- 22. 使用指針:指針指針指針
- 23. 使用指針用C
- 24. 指針用C使用OpenMP
- 25. 當使用指針用C
- 26. 用ASSERT-C++
- 27. 指針指針(C++)
- 28. 在C中使用指針創建動態數組使用指針答案
- 29. 使用void指針在C++中打印數組我使用void指針
- 30. 在C和C++中,const指針指針指的是什麼?
如果一個指針永遠不能爲空,那麼你可能想考慮把它變成一個引用(當然,如果可能的話)。 – 2009-12-10 08:45:59