程序員面試題精選100題(62)-C/C++/C#面試題(5)

時間:2019-09-22 編輯:范文亭

問題(21):C#是一門托管語言,那么是不是說明只要用C#,就能保證不會出現內存泄露和其他資源泄漏?如果不是,在哪些情況下可能會出現泄漏?

答案:C#不能保證沒有資源泄漏。比如如下幾種情況可能會造成資源泄漏:(1) 調用Native code,比如用P/Invoke或者調用COM;(2) 讀寫文件時的,沒有及時close stream, 或者ADO.NET連數據庫時,沒有及時關閉連接,也算資源泄漏?(3)注冊事件后沒有remove,導致publisher和subscriber的強依 賴,垃圾回收可能會被推遲;(4).NET還定義了一些方法直接申請非托管內存,比如Marshal.AllocHGlobal和Marshal.AllocCoTaskMem。通過這種方式得到的內存,如果沒有及時釋放,也會造成內存泄露。

問題(22):下面的兩段C#有哪些不同?


  1. static void CatchException1()
  2. {
  3. try
  4. {
  5. Function();
  6. }
  7. catch
  8. {
  9. throw;
  10. }
  11. }
  12. static void CatchException2()
  13. {
  14. try
  15. {
  16. Function();
  17. }
  18. catch (Exception e)
  19. {
  20. throw e;
  21. }
  22. }

答案:兩個函數的catch都是重新拋出截獲的exception,但拋出的exception的call stack是不一樣的。對于第一種方法,exception的call stack是從最開始的拋出地點開始的。對于第二種方法,exception的call stack是從CatchException2開始的,最初拋出的地方相關的信息被隱藏了。

問題(23):運行下圖中的C++代碼,打印出的結果是什么?


  1. bool Fun1(char* str)
  2. {
  3. printf("%s\n", str);
  4. return false;
  5. }
  6. bool Fun2(char* str)
  7. {
  8. printf("%s\n", str);
  9. return true;
  10. }
  11. int _tmain(int argc, _TCHAR* argv[])
  12. {
  13. bool res1, res2;
  14. res1 = (Fun1("a") && Fun2("b")) || (Fun1("c") || Fun2("d"));
  15. res2 = (Fun1("a") && Fun2("b")) && (Fun1("c") || Fun2("d"));
  16. return res1 || res2;
  17. }

答案:打印出4行,分別是a、c、d、a。

在C/C++中,與、或運算是從左到右的順序執行的。在計算rest1時,先計算Fun1(“a”) && Func2(“b”)。首先Func1(“a”)打印出內容為a的一行。由于Fun1(“a”)返回的是false, 無論Func2(“b”)的返回值是true還是false,Fun1(“a”) && Func2(“b”)的結果都是false。由于Func2(“b”)的結果無關重要,因此Func2(“b”)會略去而不做計算。接下來計算Fun1(“c”) || Func2(“d”),分別打印出內容c和d的兩行。

                在計算rest2時,首先Func1(“a”)打印出內容為a的一行。由于Func1(“a”)返回false,和前面一樣的道理,Func2(“b”)會略去不做計算。由于Fun1(“a”) && Func2(“b”)的結果是false,不管Fun1(“c”) && Func2(“d”)的結果是什么,整個表達式得到的結果都是false,因此Fun1(“c”) && Func2(“d”)都將被忽略。

問題(24):運行下面的C#代碼,打印出來的結果是什么?


  1. struct Person
  2. {
  3. public string Name;
  4. public override string ToString()
  5. 共2頁
  6. 上一頁
  7. 1
  8. 2
  9. 下一頁
本文已影響
相關文章
大亨pk10计划苹果版