青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

隨筆 - 55  文章 - 15  trackbacks - 0
<2012年6月>
272829303112
3456789
10111213141516
17181920212223
24252627282930
1234567

常用鏈接

留言簿

隨筆分類

隨筆檔案

搜索

  •  

最新評(píng)論

閱讀排行榜

評(píng)論排行榜

      最近在重溫c++基礎(chǔ)知識(shí),反正閑著也是沒事干,以前只聽說過這本書,但是從來沒看過。畢業(yè)那會(huì)看的是面向?qū)ο缶幊蹋彩菄?guó)外的某個(gè)牛人寫的,但是是機(jī)械出版社出版的,讀起來比較順暢,但是里面有些細(xì)節(jié)還是不清楚。這本書是c++大牛寫的,清華大學(xué)出版社翻譯出來,剛開始讀的時(shí)候覺得翻譯挺別扭的,但是自己去看原文的時(shí)候,又礙于語言學(xué)的不好,發(fā)現(xiàn)很多翻譯出來還沒這本書好,就先姑且讀之,以后慢慢再看英文原版。
      讀了這么長(zhǎng)時(shí)間的書了,第一卷基本上要讀完了,最后四章之前看得比較匆忙,沒好好理解,現(xiàn)在又重新翻了一遍,很多東西跟我原來想的完全不一樣,而且這本書讀了之后可以讓人知道為什么要這樣做,從根本上剖析了做這件事的理由,我覺得讀了之后挺有益的,就先把讀書筆記貼出來。
      
      今天分享一下new 和 delete兩個(gè)操作符,面試的時(shí)候面試官很喜歡問,new 和 malloc有什么區(qū)別?當(dāng)初只是知道new最重要的是要調(diào)用構(gòu)造函數(shù),而不知道為什么非要調(diào)用構(gòu)造函數(shù)。
      先來看一下如果沒有new的話,用malloc()怎么在內(nèi)存中分配一塊區(qū)域給一個(gè)類對(duì)象,分配了之后,接下來應(yīng)該怎么辦。
      
      下面是書中的一個(gè)例子,解答了上述的問題:
class Obj
{
   int i,j,k;
   enum{ sz = 100 };
   char buf[sz];
public:
   void initialize()
  {
     cout << "initializing Obj" << endl;
     i = j = k;
     memset(buf, 0 , sz);
   }
   void destroy()const
   {
     cout<< "destroying Obj" << endl;
    }

};

int main()
{
  Obj* obj = (Obj*)malloc(sizeof(Obj));
  assert(obj != null);
  obj->initialize();
  obj->destroy();
  return 0;
}

      我們知道,在c++中,編譯器一定要初始化一個(gè)類對(duì)象之后才能對(duì)其進(jìn)行操作,使用malloc動(dòng)態(tài)分配內(nèi)存給對(duì)象之后,還要記得一定要初始化它,不然,這個(gè)對(duì)象就沒辦法用,而且很多人只關(guān)注類的功能,而不往往會(huì)忘掉初始化,這是bug的一個(gè)重要來源。所以c++想把分配內(nèi)存和初始化這兩份工作一塊讓編譯器處理了,不用我們程序員惦記著。

      所以new的作用就是,先為這個(gè)對(duì)象分配一塊足夠容納這個(gè)對(duì)象的內(nèi)存,然后調(diào)用其構(gòu)造函數(shù),初始化這塊內(nèi)存區(qū)域(注意分配內(nèi)存和初始化的順序,這對(duì)我們自理解重載new操作符有幫助)。delete的作用就是,先調(diào)用析構(gòu)函數(shù)將內(nèi)存中的參數(shù)清理掉(我理解是:指針清零,其他變量不管), 然后釋放這塊內(nèi)存。

      這里說一下前幾天看的網(wǎng)易公開課中的《編程范式》里面講的,其實(shí)我們分配堆上的內(nèi)存的時(shí)候,哪塊內(nèi)存被分配了,哪塊沒被分配是記錄在一塊區(qū)域里面的,未被分配的空間都是鏈?zhǔn)竭B接起來的,被分配的空間也是鏈?zhǔn)竭B接起來的。第一塊未被分配的空間最后四個(gè)字節(jié)指向了下一個(gè)未被分配的空間的地址,然后依次指向后面的未被分配的空間地址。被分配的空間亦是如此。那么,當(dāng)我們調(diào)用new的時(shí)候,申請(qǐng)的這塊內(nèi)存的首地址就被寫到前面一個(gè)的最后四個(gè)字節(jié)里面,說明這些空間是被占用的,不能再被分配了。當(dāng)我們調(diào)用delete的時(shí)候,這塊內(nèi)存的首地址就會(huì)被寫到未分配的字節(jié)中去。如果我們一塊堆內(nèi)存已經(jīng)沒有用了,但是沒有釋放掉,那么它的地址不會(huì)被寫到未使用字節(jié)中去,那么你永遠(yuǎn)也用不了這塊內(nèi)存,這就是內(nèi)存泄漏。

      那如果我們重載new和delete操作符的時(shí)候,我們不可能顯示地調(diào)用構(gòu)造函數(shù)和析構(gòu)函數(shù),那我們?cè)趺磥碇剌d呢?答案是,我們只負(fù)責(zé)分配內(nèi)存的規(guī)則,調(diào)用構(gòu)造函數(shù)和析構(gòu)函數(shù)是編譯器的事情。
      如果我們用全局函數(shù)來重載new的話,那么原來的new就沒用了,就完完全全被我們的new覆蓋了。如果用成員函數(shù)來做的話,new只針對(duì)那個(gè)類。
      new操作符會(huì)接受一個(gè)size_t類型的參數(shù),標(biāo)志著要分配的內(nèi)存的大小,這個(gè)參數(shù)是編譯器給我們的。編譯器會(huì)針對(duì)這個(gè)類型判斷該分配多少內(nèi)存。new操作符的返回值是個(gè)void*,因?yàn)槲覀冏龅闹皇且峙湟粔K內(nèi)存,這塊內(nèi)存還沒被初始化,所以返回值不是指向一個(gè)類的指針。
      delete操作符接受一個(gè)指向new操作符分配的內(nèi)存的void*指針,之所以是void*, 而不是類型的指針,是因?yàn)槲覀兊膁elete是在析構(gòu)函數(shù)調(diào)用完之后才開始回收空間的。所以我說要記住順序啊。
       好了,來點(diǎn)代碼說說重載是怎么進(jìn)行的吧。
#include <cstdlib> // malloc(), free()
#include <cstdio> // puts() , printf()
using namespace std;

voidoperator new( size_t sz)

  printf("operator new %d Bytes\n", sz);
  void* m = malloc(sz);
  if(!m) puts("out of memory");
  return m;
}

void operator delete(void* m)
{
  puts("operator delete");
  free(m);
}

class S
{
  int i[100];
public:
  S(){ puts("S::S()");}
  ~S(){ puts("S::~S()");}
};


int main()
{
  int* p = new int(47);
  delete p;
  S* s = new S;
  delete s;
  S* sa = new S[3];// 這里我一直以為會(huì)new 3次,調(diào)用3次構(gòu)造函數(shù)。但實(shí)際上是new 1次,
                          //  分配1204個(gè)字節(jié),然后三次構(gòu)造函數(shù),多余的4個(gè)字節(jié)存放包含的對(duì)象的數(shù)量信息
  delete sa;          //   這里同樣的,調(diào)用三次析構(gòu)函數(shù),delete操作符調(diào)用一次。
  return 0;
}
      注意:構(gòu)造函數(shù)總是在new返回之后調(diào)用,如果new失敗的話,構(gòu)造函數(shù)不會(huì)被調(diào)用,且返回值是0。

      另外需要注意的是,void*指針最好不能用delete釋放,編了一下程序
      void* a = new Obj(2);
      delete a;
      這段代碼編譯是成功的,但是運(yùn)行時(shí),既沒有調(diào)用構(gòu)造函數(shù),也沒有調(diào)用析構(gòu)函數(shù),而且程序出現(xiàn)假死現(xiàn)象。我分析原因是,當(dāng)編譯器看到第一行代碼的時(shí)候,知道我只是要分配一個(gè)Obj這么大的一塊內(nèi)存空間,因?yàn)槭莢oid* ,所以我也不必為它初始化。在delete的時(shí)候,既然我不知道你這塊內(nèi)存中放的是什么類型的對(duì)象,那我就不知道應(yīng)該調(diào)用哪個(gè)析構(gòu)函數(shù)。情理上這么分析是合情合理的。
      
      另外我學(xué)到的另一點(diǎn)是,重載new[]和重載new操作符原理上是一樣的,它們接收的都是一個(gè)size_t的參數(shù),來標(biāo)識(shí)分配多少空間。delete[]與delete也基本相同。

     大概就是這么多,在堆上分配最大的好處是可以被程序員自己控制,有些時(shí)候,在棧中分配內(nèi)存不能滿足我們的要求,就必須在堆上分配。另外,初始化是c++必須要保證的東西,非常重要。
    

     最后,哪位大神能告訴我怎么排版?博客園自帶的排版功能我怎么不太會(huì)用呢。。。囧








1
posted on 2012-04-20 21:07 Dino-Tech 閱讀(239) 評(píng)論(0)  編輯 收藏 引用

只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。
網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            欧美大片免费观看在线观看网站推荐| 国模大胆一区二区三区| 欧美精品一区二区在线观看| 国产欧美视频一区二区三区| 中文高清一区| 欧美二区在线观看| 国产精品99久久久久久人| 牛牛影视久久网| 久久伊人一区二区| 国内揄拍国内精品少妇国语| 久久成人免费日本黄色| 亚洲欧美另类在线| 国产婷婷精品| 亚洲女人天堂av| 一区二区三区视频在线| 亚洲激情综合| 欧美国产三区| 国产精品一区在线播放| 中日韩高清电影网| 一本一道久久综合狠狠老精东影业 | 美女爽到呻吟久久久久| 欧美在线播放一区二区| 欧美精品xxxxbbbb| 日韩一级免费| 久久一区二区精品| 欧美一区二区黄色| 国产区精品在线观看| 久久精品91久久久久久再现| 久久久久91| 久久久久久久性| 99精品久久久| 午夜精品久久久久久久久久久久久| 国产毛片一区二区| 免费成人高清视频| 欧美三级日本三级少妇99| 欧美日韩国产色综合一二三四 | 欧美日韩国产小视频在线观看| 亚洲一区二区三区四区五区午夜 | 亚洲精品久久久久久久久| 欧美大片在线观看一区| 欧美午夜a级限制福利片| 亚洲免费视频在线观看| 久久久久免费观看| 亚洲国产精品视频| 亚洲一区二区三区四区中文 | 欧美一区二区私人影院日本| 亚洲成色精品| 久久精品日产第一区二区三区| 久久欧美中文字幕| 亚洲电影免费观看高清| 一区二区三区成人| 永久免费毛片在线播放不卡| 久久精品国产欧美亚洲人人爽| 蜜桃av综合| 久久aⅴ国产紧身牛仔裤| 欧美成人精品在线观看| 久久夜色撩人精品| 国产精品久久久999| 欧美顶级少妇做爰| 国产亚洲欧美一级| 一本色道久久综合亚洲精品不| 狠狠色噜噜狠狠狠狠色吗综合| 一区二区免费在线播放| 亚洲黄网站在线观看| 久久成人av少妇免费| 亚洲麻豆视频| 一区二区三区日韩| 日韩视频精品在线观看| 噜噜噜91成人网| 亚洲一区二区三区高清 | 欧美国产日产韩国视频| 国产无一区二区| 亚洲在线播放电影| 亚洲一区二区三区在线看| 女人色偷偷aa久久天堂| 免费成人av在线| 韩国成人福利片在线播放| 亚洲一区二区三区免费视频 | 国产精品电影网站| 欧美激情中文字幕在线| 激情视频亚洲| 久久精品一区四区| 久久综合电影一区| 在线观看亚洲视频啊啊啊啊| 欧美一区二区啪啪| 久久爱www| 国产一区二区欧美| 性伦欧美刺激片在线观看| 午夜精品一区二区三区电影天堂 | 亚洲欧美激情在线视频| 亚洲欧美日韩专区| 国产精品国色综合久久| 国产精品99久久99久久久二8| 亚洲天堂男人| 国产精品欧美日韩一区| 亚洲免费婷婷| 久久精品视频va| 亚洲二区视频| 欧美大秀在线观看| 亚洲免费av电影| 亚洲欧美日韩综合aⅴ视频| 国产精品任我爽爆在线播放 | 久久久久国产精品厨房| 亚洲激情影视| 欧美在线高清视频| 亚洲国产精品悠悠久久琪琪| 欧美日韩综合在线| 久久人人爽人人爽| 在线午夜精品自拍| 欧美成人精品影院| 欧美一级免费视频| 99在线精品观看| 国产在线一区二区三区四区| 欧美高清不卡| 久久国产精品网站| 亚洲一级黄色片| 亚洲高清不卡| 久久影院亚洲| 欧美一区=区| 在线亚洲精品| 亚洲精品永久免费| 狠狠综合久久| 国产欧美综合一区二区三区| 欧美日本久久| 欧美国产精品久久| 久久精品理论片| 性欧美xxxx视频在线观看| 日韩午夜黄色| 亚洲美女黄色片| 91久久精品www人人做人人爽| 久久香蕉国产线看观看av| 午夜精品久久久| 亚洲午夜国产成人av电影男同| 亚洲精品免费一二三区| 在线免费观看日本欧美| 国产亚洲精品激情久久| 国产精品一区二区在线观看| 欧美日一区二区三区在线观看国产免| 蘑菇福利视频一区播放| 久久婷婷色综合| 久久躁日日躁aaaaxxxx| 久久午夜精品一区二区| 久久久一区二区三区| 久久精品一区二区三区中文字幕| 亚洲欧美国产高清| 香港久久久电影| 久久av资源网站| 久久久欧美精品| 免费亚洲电影| 欧美精品一区三区| 欧美啪啪成人vr| 欧美日韩另类字幕中文| 欧美日韩影院| 国产精品日韩欧美| 国产亚洲福利社区一区| 国产亚洲精品自拍| 亚洲国产精品第一区二区三区| 亚洲国产精选| 亚洲视频图片小说| 欧美一区激情视频在线观看| 欧美一区在线视频| 嫩草伊人久久精品少妇av杨幂| 欧美成人a视频| 日韩午夜三级在线| 午夜日韩电影| 久久影视精品| 欧美视频一区二区三区在线观看| 国产精品久久久久久久久果冻传媒| 国产精品毛片va一区二区三区| 国产日韩在线视频| 亚洲福利在线观看| 亚洲午夜一区二区三区| 久久精品1区| 91久久久久久国产精品| 亚洲一区免费视频| 久久人91精品久久久久久不卡| 欧美精彩视频一区二区三区| 欧美性生交xxxxx久久久| 一本色道精品久久一区二区三区| 欧美视频导航| 黄色成人av网| 一区二区三区四区五区精品视频| 午夜在线成人av| 男人的天堂成人在线| 日韩一级欧洲| 久久一区二区三区av| 欧美日韩亚洲综合| 在线成人激情视频| 亚洲一区免费观看| 欧美激情1区2区| 欧美一级大片在线免费观看| 欧美成人官网二区| 国产一区二区视频在线观看 | 国产精品v亚洲精品v日韩精品| 国产亚洲激情在线| 一区二区三区四区五区在线| 久久免费午夜影院| 亚洲一区在线免费观看| 欧美精品 日韩| 亚洲国产精品久久精品怡红院|