歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> Linux編程

C++內存分配與復制構造函數筆試考察

去參加筆試了,有兩道題做錯了,都是印象裡面有概念,但是沒有弄清楚它到底是怎麼回事,原理是什麼,導致題目打錯,現總結一下。

一、C++內存分配筆試考察

問題考察如下,請先不要看答案,看看你能否做對,呵呵:

怎麼樣,暈了沒?正確答案及解析如下:

解析:char p[] = “...”是一個數組,這個數組是局部變量。char *p = “...”,是一個指針,這個指針指向一個字符串常量。區別在於:數組的話,字符串是存在這個數組裡的,因為這個數組屬於局部變量(存在棧區),而當該函數執行完,位於棧區的局部變量就銷毀了,就算把數組的地址返回給主函數,主函數也無法訪問到原有字符串了,應該輸出亂碼。但是,如果是指向字符串常量的指針,這個字符串是放在程序的常量區而不是放在局部變量中,那麼把這個常量的地址返回給主函數,主函數也是可以訪問它的。

下面就針對C++中的內存分配做個總結:

一個C/C++編譯的程序占用的內存分為以下幾個部分:

1. 棧區(stack)

由編譯器自動分配釋放,存放函數地址、函數參數值、局部變量的值等。

2. 堆區(heap)

就是那些由new分配的內存塊,他們的分配與釋放由程序員負責,一般一個new就要對應一個delete。如果程序員沒有釋放掉,那麼在程序結束後,操作系統會自動回收。

3. 全局/靜態區(static)

全局變量和靜態變量的存儲是放在一塊的,初始化的全局變量和初始化的靜態變量在一塊區域,為初始化的全局變量和未初始化的靜態變量在相鄰的另一塊區域。程序結束後由系統釋放。

4. 常量存儲區(const)

常量字符串就是放在這裡的。

5. 程序代碼區

存放函數體的二進制代碼。

其中,堆棧的主要區別如下:

爽歪歪了吧,下面就來看第二個問題吧。。。

C++ 設計新思維》 下載見 http://www.linuxidc.com/Linux/2014-07/104850.htm

C++ Primer Plus 第6版 中文版 清晰有書簽PDF+源代碼 http://www.linuxidc.com/Linux/2014-05/101227.htm

讀C++ Primer 之構造函數陷阱 http://www.linuxidc.com/Linux/2011-08/40176.htm

讀C++ Primer 之智能指針 http://www.linuxidc.com/Linux/2011-08/40177.htm

讀C++ Primer 之句柄類 http://www.linuxidc.com/Linux/2011-08/40175.htm

將C語言梳理一下,分布在以下10個章節中:

  1. Linux-C成長之路(一):Linux下C編程概要 http://www.linuxidc.com/Linux/2014-05/101242.htm
  2. Linux-C成長之路(二):基本數據類型 http://www.linuxidc.com/Linux/2014-05/101242p2.htm
  3. Linux-C成長之路(三):基本IO函數操作 http://www.linuxidc.com/Linux/2014-05/101242p3.htm
  4. Linux-C成長之路(四):運算符 http://www.linuxidc.com/Linux/2014-05/101242p4.htm
  5. Linux-C成長之路(五):控制流 http://www.linuxidc.com/Linux/2014-05/101242p5.htm
  6. Linux-C成長之路(六):函數要義 http://www.linuxidc.com/Linux/2014-05/101242p6.htm
  7. Linux-C成長之路(七):數組與指針 http://www.linuxidc.com/Linux/2014-05/101242p7.htm
  8. Linux-C成長之路(八):存儲類,動態內存 http://www.linuxidc.com/Linux/2014-05/101242p8.htm
  9. Linux-C成長之路(九):復合數據類型 http://www.linuxidc.com/Linux/2014-05/101242p9.htm
  10. Linux-C成長之路(十):其他高級議題

更多詳情見請繼續閱讀下一頁的精彩內容: http://www.linuxidc.com/Linux/2015-02/112883p2.htm

Copyright © Linux教程網 All Rights Reserved