• <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>

              C++博客 :: 首頁 :: 聯(lián)系 ::  :: 管理
              163 Posts :: 4 Stories :: 350 Comments :: 0 Trackbacks

            常用鏈接

            留言簿(48)

            我參與的團隊

            搜索

            •  

            積分與排名

            • 積分 - 401320
            • 排名 - 59

            最新評論

            閱讀排行榜

            評論排行榜

            C++編譯器會為每個類自動生成一個默認的構(gòu)造函數(shù)、析構(gòu)函數(shù)、賦值函數(shù)、拷貝構(gòu)造函數(shù),這當然是在你沒有為你的類聲明這些函數(shù)的時候。這些默認的功能函數(shù)在為你提供方便的時候,也會給你帶來麻煩。

            例如:

            class string {
            public:
              string(const char *value);
              ~string();

              ...                           // 沒有拷貝構(gòu)造函數(shù)和operator=

            private:
              char *data;
            };

            string::string(const char *value)
            {
              if (value) {
                data = new char[strlen(value) + 1];
                strcpy(data, value);
              }
              else {
                data = new char[1];
                *data = '\0';
              }
            }

            inline string::~string() { delete [] data; }           //注意:new 和delete 要采用相同的形式。

            如果有string的兩個對象,

            string a("hello");
            string b("world");

            當b=a時,因為你自己沒為類定義那些函數(shù),所以C++編譯器會提供默認的賦值函數(shù),這個缺省的賦值操作符會執(zhí)行從a的成員到b的成員的逐個成員的賦值操作,對指針(a.data和b.data) 來說就是逐位拷貝。這種情況下至少有兩個問題。

            第一,b曾指向的內(nèi)存永遠不會被刪除,因而會永遠丟失。這是產(chǎn)生內(nèi)存泄漏的典型例子。

            第二,現(xiàn)在a和b包含的指針指向同一個字符串,那么只要其中一個離開了它的生存空間,其析構(gòu)函數(shù)就會刪除掉另一個指針還指向的那塊內(nèi)存,重復(fù)析構(gòu)的問題。

            下面的語句:

            string a("hello");                // 定義并構(gòu)造 a

            {                                        // 開一個新的生存空間
              string b("world");            // 定義并構(gòu)造 b

              ...

              b = a;                              // 執(zhí)行 operator=,    調(diào)用默認賦值函數(shù)
                                                     // 丟失b的內(nèi)存,造成內(nèi)存泄露。

            }                                        // 離開生存空間, 調(diào)用
                                                     // b的析構(gòu)函數(shù)

            string c = a;                       // c.data 的值不能確定!  調(diào)用默認的拷貝構(gòu)造函數(shù) 
                                                     // 但是a.data 已被刪除,無法進行拷貝構(gòu)造。

             

            當這類對象進行函數(shù)參數(shù)按值傳遞時,形參會按照缺省的拷貝構(gòu)造函數(shù)進行初始化,形參擁有一個指向該對象指針的一個拷貝,當函數(shù)結(jié)束時,形參會調(diào)用析構(gòu)函數(shù),該對象的指針也被銷毀。

            class stack
            {
            public:
                stack(const char *value);
                ~stack();
                char * data;
            };

            stack::stack(const char *value)
            {
                if(value)
                {
                    data= new char[strlen(value)+1];
                    strcpy(data,value);
                }
                else
                {
                    data= new char[1];
                    *data = '\0';
                }

            }

            inline stack::~stack()
            {
                delete []data;
            }

            void dosth(stack pstk)
            {
                cout<<pstk.data<<endl;
            }

            int main()
            {
             stack str("iamxczhang");

              dosth(str);

            }
            在析構(gòu)函數(shù)出設(shè)立斷點,你會看到析構(gòu)函數(shù)執(zhí)行兩次! 

            牢記:只要類里有指針變量就得自己寫拷貝構(gòu)造函數(shù)和賦值函數(shù),但是你確定用不著這些函數(shù)時,可以把這些函數(shù)做private聲明而不去實現(xiàn)它,這就防止了會有人去調(diào)用它們,也防止了編譯器去生成它們。

            posted on 2008-01-21 16:38 sdfasdf 閱讀(3906) 評論(0)  編輯 收藏 引用 所屬分類: C++
            久久久久亚洲AV无码麻豆| 久久国产三级无码一区二区| 久久精品国产亚洲AV香蕉| 国产69精品久久久久9999APGF| 久久午夜无码鲁丝片秋霞 | 亚洲精品无码久久久久AV麻豆| 久久最新免费视频| 久久香蕉国产线看观看精品yw| 国产欧美久久久精品影院| 中文字幕乱码人妻无码久久| 国产精品久久久久天天影视| 国产精品久久久久久久app| 久久香蕉一级毛片| 人妻精品久久无码区| 女同久久| 久久精品国产只有精品66| 久久国产精品一国产精品金尊| 中文成人无码精品久久久不卡 | 亚洲欧美日韩久久精品第一区| 久久这里只有精品久久| 人妻少妇久久中文字幕一区二区 | 亚洲乱码中文字幕久久孕妇黑人| 精品综合久久久久久88小说| 国产精品久久久久国产A级| 国产成人精品久久| 亚洲AV乱码久久精品蜜桃| 麻豆久久久9性大片| 亚洲国产成人久久综合碰| 久久久久人妻一区精品色| 久久久久人妻一区精品| 99久久免费国产精品| 要久久爱在线免费观看| 久久国产香蕉视频| 韩国三级中文字幕hd久久精品 | 久久露脸国产精品| 久久99精品国产99久久6| 精品99久久aaa一级毛片| 国产一区二区精品久久岳| 久久久WWW成人免费精品| 久久精品亚洲欧美日韩久久| 久久精品国产亚洲7777|