日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

【面试】 C++ 面试题笔记(不定期更新)

發布時間:2024/4/18 c/c++ 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【面试】 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, 方便我們程序員測試,以及出現bug時的分析解決
  • Release模式下,就沒有上述那些調試信息,而且編譯器也會自動優化一些代碼,這樣生成的程序性能是最優的,但是如果出現問題,就不方便分析測試了
  • 因為在Debug中有ASSERT斷言保護,所以要崩潰,而在Release優化中就會刪掉ASSERT,所以會出現正常運行。
    但是不推薦如此做,因為這樣會覆蓋不屬于自己的內存,這是搭上了程序崩潰的列車,即未定義行為,出現什么后果都有可能的,程序員的職責是保證不越界,而不是追問越界之后會發生什么。就像生活中違法不一定立刻被抓,但是遲早是要被抓的。

    動手測試:
    環境:Visual Studio 2017

    #include <stdio.h> #include <stdlib.h> #include <string.h> void func() {char b[2] = { 0 };strcpy(b, "aaaa"); } int main() {func();system("pause");return 0; }

    測試結果:

  • 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. 存在編譯錯誤

    與50位技術專家面對面20年技術見證,附贈技術全景圖

    總結

    以上是生活随笔為你收集整理的【面试】 C++ 面试题笔记(不定期更新)的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。