矯情的C++——不明確行為(undefined behavior)
1. 使用未經初始化的(尤其是基本型別)區域性變數
void foo()
{
int a;
++a; // 錯誤,使用了未經初始化的區域性變數
}
void foo()
{
int* p = 0;
std::cout << *p; // 提領一個null指標,將會導致不明確行為
}
基本型別不像類型別,會隱式地呼叫其預設建構函式,更詳細的內容參見
void foo()
{
int a = int();
// == (int a = 0;),
// 使用型別初始化的形式是為了保持基本型別和類型別形式上的統一,尤其在涉及到模板時
}
2. 當derived class 物件經由一個base class指標刪除,而該base class帶著一個non-virtual 解構函式
這裡最好記住幾個結論:
- 如果class不含virtual函式,通常表示它並不意圖被用作一個base class
- 當一個class不企圖被當做base class,令其虛構函式為virtual往往是個壞主意
- 任何class只要帶有virtual函式(客製化)都幾乎確定應該也有一個virtual 解構函式
- 只有當class內至少函一個virtual函式,就應當為其宣告virtual解構函式
3. transform 兩個輸入區間的長度不一致時
在STL的演算法(<algorithm>)實現中,一般針對某一函式(也即是某一特定演算法)都有兩個版本(或者叫函式過載),一種是基礎版本,一種是泛化版本。
transform
演算法的遍歷基準是第一輸入序列。
template<typename InputIterator, typename OutputIterator,
typename UnaryOperation>
OutputIterator transform(InputIterator first, InputIterator last,
OutputIterator resutl, UnaryOperation op)
{
for (; first != last; ++first, ++result)
{
// 這裡要保證OutputIterator的長度不能低於InputIterator的長度
*result = op(*first);
}
return result;
}
template<typename InputIterator, typename OutputIterator,
typename BinaryOperation>
OutputIterator transform(InputIterator first1, InputIterator last1,
InputIterator first2, InputIterator last2,
BinaryOperation binary_op)
{
for(; first1 != last1; ++first1, ++first2, ++result)
{
// 這裡不僅要保證輸出序列的長度不能低於第一個輸入序列與的長度
// 而且要保證第二個輸入序列的長度不能低於第一個輸入序列的長度
*result = binary_op(*first1, *first2);
}
return result;
}
版本1和版本2都會存在的undefined behavior是:
輸出序列(OutputIterator)的有效長度低於輸入序列(InputIterator)的長度
版本2可能出現的undefined behavior:
第二個輸入序列(InputIterator 2) 的長度低於第一個輸入序列(InputIterator 1)的長度
這裡僅要求輸出序列的長度不低於輸入序列的長度,而不要求嚴格相等。
4. static_cast 執行向下型別轉換時
class B
{
public:
virtual void foo() {}
};
class D :public B
{};
當父類指標指向子類物件時,使用static_cast是沒有問題的:
B* b = new D;
D* d1 = static_cast<D*>(b);
D* d2 = dynamic_cast<D*>(b);
當父類指標指向父類物件時,使用static_cast存在安全問題的,或者再使用static_cast進行強制向下型別轉換就會出現undefined behavior
:
B* b = new B;
D* d1 = static_cast<D*>(b);
// 使用 d1 訪問屬於D的成員時,即為undefined behavior
D* d2 = dynamic_cast<D*>(b);
// 返回 nullptr
相關文章
- 情景劇:C/C++中的未定義行為(undefined behavior)C++Undefined
- C++中的UB(undefined behaviour)未定義行為C++Undefined
- WPF點滴(3) 行為-Behavior
- _error-type_cout_不明確的符號Error符號
- C++序列點解析:確保程式碼行為可控的關鍵步驟C++
- 柬埔寨加密貨幣行業持續發展,監管不明確影響甚微加密行業
- C++未定義行為C++
- undefined會變為null嗎?UndefinedNull
- 重要的ui元件——BehaviorUI元件
- C++:與C混合程式設計 CMake undefined reference toC++程式設計Undefined
- jmeter 介面自動化連載 (10)- 響應資訊不明確的介面關聯JMeter
- 【JavaScript】奇怪的知識void 0 === undefined 為 trueJavaScriptUndefined
- POLIR-Society-Organization-Psychology-Emotions情緒 : The 6 Types of Basic Emotions and Their Effect on Human Behavior
- 自定義behavior-仿華為應用市場
- 【YashanDB知識庫】v$instance檢視中例項角色含義不明確
- 為什麼用「void 0」代替「undefined」Undefined
- ThinkPHP3.2 中 behavior 的使用PHP
- [Vue Router] Scroll BehaviorVue
- WPF MenuItem behavior MVVMUIMVVM
- Use IE userdata behavior
- 自定義 behavior 完美仿 QQ 瀏覽器首頁,美團商家詳情頁瀏覽器
- opencv外接矩形矯正OpenCV
- 【C++】智慧指標的正確使用方式C++指標
- WPF KeyDown MVVM Via BehaviorMVVM
- WPF Behavior InvokeCommandAction Command CommandParameter
- chrome擴充套件chrome.extension.getBackgroundPage()為undefined的問題原因Chrome套件Undefined
- share undefinedUndefined
- WPF ListBox scrollintoview in ViewModel via behaviorView
- C++編譯錯誤的正確查詢方式C++編譯
- 還不明白 Docker 的映象跟容器?Docker
- 使用 OpenCV 進行文件矯正OpenCV
- 如何進行正確的 CodeReviewView
- Jenkins+Gitlab 執行 selenium 為何報版本不正確的問題JenkinsGitlab
- 執行專案報錯Cannot read property 'styles' of undefinedUndefined
- php執行出現Call to undefined function curl_init()PHPUndefinedFunction
- [譯] 理解 JavaScript 中的 undefinedJavaScriptUndefined
- null 和 undefined 的區別NullUndefined
- null 和 undefined 的區別!NullUndefined
- “一直不明白,程式設計師為什麼要加班。”程式設計師