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

            hqh

            C++博客 聯(lián)系 聚合 管理
              4 Posts :: 2 Stories :: 2 Comments :: 0 Trackbacks

            2007年4月18日 #

            學完C++一些初級的知識后,應該怎樣進一步學習更多的知識,請大家介紹一下
            posted @ 2007-04-18 20:41 hqh 閱讀(190) | 評論 (2)編輯 收藏

            2007年4月7日 #

             在別處看到的一個資料,愿與大家分享。
            內(nèi)存泄漏的慨念

              1.c/c++是程序員自己管理內(nèi)存,Java內(nèi)存是由GC自動回收的。

              我雖然不是很熟悉C++,不過這個應該沒有犯常識性錯誤吧。

              2.什么是內(nèi)存泄露?

              內(nèi)存泄露是指系統(tǒng)中存在無法回收的內(nèi)存,有時候會造成內(nèi)存不足或系統(tǒng)崩潰。

              在C/C++中分配了內(nèi)存不釋放的情況就是內(nèi)存泄露。

              3.Java存在內(nèi)存泄露

              我們必須先承認這個,才可以接著討論。雖然Java存在內(nèi)存泄露,但是基本上不用很關(guān)心它,特別是那些對代碼本身就不講究的就更不要去關(guān)心這個了。

              Java中的內(nèi)存泄露當然是指:存在無用但是垃圾回收器無法回收的對象。而且即使有內(nèi)存泄露問題存在,也不一定會表現(xiàn)出來。

              4.Java中參數(shù)都是傳值的。

              對于基本類型,大家基本上沒有異議,但是對于引用類型我們也不能有異議。

              Java內(nèi)存泄露情況

              JVM回收算法是很復雜的,我也不知道他們怎么實現(xiàn)的,但是我只知道他們要實現(xiàn)的就是:對于沒有被引用的對象是可以回收的。所以你要造成內(nèi)存泄露就要做到:

              持有對無用對象的引用!

              不要以為這個很容易做到,既然無用,你怎么還會持有它的引用? 既然你還持有它,它怎么會是無用的呢?

              我實在想不到比那個堆棧更經(jīng)典的例子了,以致于我還要引用別人的例子,下面的例子不是我想到的,是書上看到的,當然如果沒有在書上看到,可能過一段時間我自己也想的到,可是那時我說是我自己想到的也沒有人相信的。

            public class Stack {
             private Object[] elements=new Object[10];
             private int size = 0;

             public void push(Object e){
              ensureCapacity();
              elements[size++] = e;
             }

             public Object pop(){
              if( size == 0)
               throw new EmptyStackException();
               return elements[--size];
             }

            private void ensureCapacity(){
             if(elements.length == size){
              Object[] oldElements = elements;
              elements = new Object[2 * elements.length+1];
              System.arraycopy(oldElements,0, elements, 0, size);
             }
            }
            }

              上面的原理應該很簡單,假如堆棧加了10個元素,然后全部彈出來,雖然堆棧是空的,沒有我們要的東西,但是這是個對象是無法回收的,這個才符合了內(nèi)存泄露的兩個條件:無用,無法回收。

              但是就是存在這樣的東西也不一定會導致什么樣的后果,如果這個堆棧用的比較少,也就浪費了幾個K內(nèi)存而已,反正我們的內(nèi)存都上G了,哪里會有什么影響,再說這個東西很快就會被回收的,有什么關(guān)系。下面看兩個例子。

              例子1

            public class Bad{
             public static Stack s=Stack();
              static{
               s.push(new Object());
               s.pop(); //這里有一個對象發(fā)生內(nèi)存泄露
               s.push(new Object()); //上面的對象可以被回收了,等于是自愈了
              }
            }

              因為是static,就一直存在到程序退出,但是我們也可以看到它有自愈功能,就是說如果你的Stack最多有100個對象,那么最多也就只有100個對象無法被回收其實這個應該很容易理解,Stack內(nèi)部持有100個引用,最壞的情況就是他們都是無用的,因為我們一旦放新的進取,以前的引用自然消失!

              例子2

            public class NotTooBad{
             public void doSomething(){
              Stack s=new Stack();
              s.push(new Object());
              //other code
              s.pop();//這里同樣導致對象無法回收,內(nèi)存泄露.
             }//退出方法,s自動無效,s可以被回收,Stack內(nèi)部的引用自然沒了,所以
             //這里也可以自愈,而且可以說這個方法不存在內(nèi)存泄露問題,不過是晚一點
             //交給GC而已,因為它是封閉的,對外不開放,可以說上面的代碼99.9999%的
             //情況是不會造成任何影響的,當然你寫這樣的代碼不會有什么壞的影響,但是
             //絕對可以說是垃圾代碼!沒有矛盾吧,我在里面加一個空的for循環(huán)也不會有
             //什么太大的影響吧,你會這么做嗎?
            }

              上面兩個例子都不過是小打小鬧,但是C/C++中的內(nèi)存泄露就不是Bad了,而是Worst了。他們?nèi)绻惶帥]有回收就永遠無法回收,頻繁的調(diào)用這個方法內(nèi)存不就用光了!因為Java還有自愈功能(我自己起的名字,還沒申請專利),所以Java的內(nèi)存泄露問題幾乎可以忽略了,但是知道的人就不要犯了。

              不知者無罪!Java存在內(nèi)存泄露,但是也不要夸大其辭。如果你對Java都不是很熟,你根本就不用關(guān)心這個,我說過你無意中寫出內(nèi)存泄露的例子就像你中一千萬一樣概率小,開玩笑了,其實應該是小的多的多!

              而且即使你有幸寫出這樣的代碼,中獎了!基本上都是一包洗衣粉,不會讓你發(fā)財,對系統(tǒng)沒有什么大的影響。

              杞人憂天的情況

              1.無話可說型

            Object obj=new Object();
            obj=null;
            //這個完全多此一舉,因為退出了作用范圍,對象的引用自動消失
            //不要在你的程序中出現(xiàn)這樣的語句,沒有錯,但是就是不雅觀

              2.思考不對型

            void func(Object o){
             o=new Object();
             return
            }

              當我們知道Java參數(shù)是傳值,就知道上面的方法什么也沒錯,就是申請了一個對象然后再丟給GC。因為是傳值,這里的o是一個調(diào)用時候的拷貝,會不會無法回收?不就是拷貝嗎,退出方法什么都沒了,這個對象怎么會留的住。

              3.盡量避免型

            class A{
             B b=new B(this);
            }
            class B{
             A a;
             B(A a){this.a=a;}
            }

            posted @ 2007-04-07 12:53 hqh 閱讀(357) | 評論 (0)編輯 收藏

            2007年3月30日 #

            昨日,我的一個同學編了一個程序,但運算出來,得不到正確的結(jié)果.他問我,我知道那個確實有一定的問題,但就是無法解釋清楚,特來請教.
            #include<stdio.h>
            void main()
            {
            printf("please input two num x and y:");
            int a,b,c;
            scanf("%5d",&a);
            printf("%d",a);
            scanf("%4d%4d",&b,&c);
            printf("%d,%d",b,c);
            }
            由于我也才接觸C++,因此我也無法作出正確解釋,希望有人能幫上忙.
            posted @ 2007-03-30 21:19 hqh 閱讀(156) | 評論 (0)編輯 收藏

            2007年3月28日 #

            近日,我終于接觸到了C++,雖然我不是學C++著個專業(yè)的,但是我對他產(chǎn)生了濃厚的興趣.
            初學C++,只知道一些簡單的算法,一些簡單的語句,但是我正在盡最大的努力學習更多這方面的知識.
            真正接觸到C++我才知道他的博大精深,要學好他也并非一件容易的事,我崇拜那些編程高手,我也向往有一天自己也能成為一個編程高手.
            所以我會加倍努力,爭取早日實現(xiàn)夢想.


            posted @ 2007-03-28 15:35 hqh 閱讀(197) | 評論 (0)編輯 收藏

            僅列出標題  
            999久久久免费精品国产| 欧美午夜A∨大片久久| 久久笫一福利免费导航 | 狠狠色丁香婷综合久久| 99麻豆久久久国产精品免费| 久久91精品久久91综合| 国产免费久久精品丫丫| 亚洲欧美日韩久久精品第一区| 久久发布国产伦子伦精品| 成人精品一区二区久久| 欧美精品乱码99久久蜜桃| 国产V综合V亚洲欧美久久| 青青草国产97免久久费观看| AV色综合久久天堂AV色综合在| 久久不射电影网| 丁香色欲久久久久久综合网| 国产亚洲精午夜久久久久久 | 精品久久久久久无码专区| 青青青伊人色综合久久| 亚洲女久久久噜噜噜熟女| 久久国产乱子伦精品免费午夜| 少妇久久久久久久久久| 久久精品桃花综合| 狠狠久久综合| 久久精品视频网| 99国产精品久久| 色偷偷88888欧美精品久久久| 久久国产精品视频| 国产成人无码精品久久久免费| 亚洲国产精品久久电影欧美| 国产激情久久久久影院老熟女| 2021少妇久久久久久久久久| 日韩人妻无码精品久久免费一| 亚洲精品tv久久久久久久久久| 亚洲国产精品久久久久婷婷老年 | 精品久久久久久国产| 久久av高潮av无码av喷吹| 国产亚洲精品自在久久| 久久香综合精品久久伊人| 亚洲精品tv久久久久久久久| 伊人久久大香线蕉综合网站|