posts - 29, comments - 0, trackbacks - 0, articles - 0
            BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理

          C++ 內存分配方式

          Posted on 2007-05-28 15:44 change 閱讀(279) 評論(0)  編輯  收藏

            最近找工作,幾乎所有的公司有要考C/C++ ,沒有辦法,呵呵~~~~只有慢慢的開始 拾起 C++ 來,好久沒有弄過C++ 了,基本語法都忘得差不多了,呵呵~~~今天看了《高質量的 C++編程》,現摘下一些話,已備忘記查找。

            

          C++內存分配方式
          內存分配方式有三種:
          (1)      從靜態存儲區域分配。內存在程序編譯的時候就已經分配好,這塊內存在程序的整個運行期間都存在。例如全局變量,static變量。
          (2)      在棧上創建。在執行函數時,函數內局部變量的存儲單元都可以在棧上創建,函數執行結束時這些存儲單元自動被釋放。棧內存分配運算內置于處理器的指令集中,效率很高,但是分配的內存容量有限。
          (3)      從堆上分配,亦稱動態內存分配。程序在運行的時候用malloc或new申請任意多少的內存,程序員自己負責在何時用free或delete釋放內存。動態內存的生存期由我們決定,使用非常靈活,但問題也最多。
          EG:
                     用函數返回值來傳遞動態內存
           
          char *GetMemory3(int num)
          {
              char *p = (char *)malloc(sizeof(char) * num);
              return p;
          }
          void Test3(void)
          {
              char *str = NULL;
              str = GetMemory3(100); 
              strcpy(str, "hello");
              cout<< str << endl;
              free(str); 
          }

           但是下面這種事有問題的:

              
          char *GetString(void)
          {
              char p[] = "hello world";
              return p;   // 編譯器將提出警告
          }
          void Test4(void)
          {
          char *str = NULL;
          str = GetString(); // str 的內容是垃圾
          cout<< str << endl;
          }

           

          這里強調不要用return語句返回指向“棧內存”的指針,因為該內存在函數結束時自動消亡,如上面的示例。  用調試器逐步跟蹤Test4,發現執行str = GetString語句后str不再是NULL指針,但是str的內容不是“hello world”而是垃圾。

           

          如果把示例7-4-4改寫成示例7-4-5,會怎么樣?
           

          char *GetString2(void)
          {
              char *p = "hello world";
              return p;
          }
          void Test5(void)
          {
              char *str = NULL;
              str = GetString2();
              cout<< str << endl;
          }

          示例7-4-5 return語句返回常量字符串
           

          函數Test5運行雖然不會出錯,但是函數GetString2的設計概念卻是錯誤的。因為GetString2內的“hello world”是常量字符串,位于靜態存儲區,它在程序生命期內恒定不變。無論什么時候調用GetString2,它返回的始終是同一個“只讀”的內存塊

           

          主站蜘蛛池模板: 巴彦淖尔市| 紫金县| 永定县| 丹江口市| 永吉县| 米林县| 乐陵市| 平湖市| 榆社县| 建宁县| 耒阳市| 定结县| 尼玛县| 临湘市| 平舆县| 平武县| 邻水| 洞头县| 扎鲁特旗| 城步| 兰州市| 景德镇市| 台州市| 大荔县| 麻城市| 乌审旗| 文山县| 阿城市| 玛多县| 永春县| 苍梧县| 铅山县| 宁强县| 百色市| 府谷县| 贡山| 安泽县| 广宗县| 湖南省| 凌云县| 丹江口市|