【面试】 C++ 面试题笔记(不定期更新)
題1.關于ASSERT:
題目描述
void func() {char b[2]={0};strcpy(b,"aaaa"); }以下說法那個正確()
A. Debug版崩潰,Release版正常
B. Debug版正常,Release版崩潰
C. Debug版崩潰,Release版崩潰
D. Debug版正常,Release版正常
題庫答案:A
牛客網解析:
assert 含義是斷言,它是標準C++的cassert頭文件中定義的一個宏,用來判斷一個條件表達式的值是否為ture,如果不為true, 程序會終止,并且報告出錯誤,這樣就很容易將錯誤定位
通常我們開發的程序有2種模式:Debug模式和Release模式
因為在Debug中有ASSERT斷言保護,所以要崩潰,而在Release優化中就會刪掉ASSERT,所以會出現正常運行。
但是不推薦如此做,因為這樣會覆蓋不屬于自己的內存,這是搭上了程序崩潰的列車,即未定義行為,出現什么后果都有可能的,程序員的職責是保證不越界,而不是追問越界之后會發生什么。就像生活中違法不一定立刻被抓,但是遲早是要被抓的。
動手測試:
環境:Visual Studio 2017
測試結果:
debug版本
使用release版本:
先將運行庫從MDd變成MD,配置從debug改成release,然后運行代碼:
現象:release版本沒有報錯,不過窗口顯示幾秒鐘后自動退出了!!!
使用了gcc 7.4.0編譯器后
分別測試開調試和開優化,運行的時候:開調試會知道棧有出現問題,開優化直接知道溢出。編譯的時候都會提示操作越界,而且數值精確(感謝唐同學熱心解答!)
這道題的答案可能跟編譯器選擇有關系。在gcc 7.4.0中測試,兩種配置都會報錯。
題2. 編譯內存:
題目描述
關于下面程序說法正確的是( )
class Item { private: char *desc; int storage; public: Item(){desc = new char[51]; } void setInfo(char *dsrc, int num) {strcpy(desc,dsrc); storage = num; } }; int main() { Item stock; stock.setInfo("pen",20); return 0; }正確答案: A
你的答案: C (錯誤)
A. main函數定義了一個stock對象占8個字節
B. storage和desc成員各占4個字節
C. 存在內存泄漏的問題
D. 存在編譯錯誤
總結
以上是生活随笔為你收集整理的【面试】 C++ 面试题笔记(不定期更新)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: [精选代码笔记]Anagram, gro
- 下一篇: [转]在VS中为C/C++源代码文件生成