<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                企業??AI智能體構建引擎,智能編排和調試,一鍵部署,支持知識庫和私有化部署方案 廣告
                # 垃圾回收(應用程序二進制接口) 在C++中,垃圾回收機制(自動回收沒有被引用的內存區域)是可選的;也就是說在編譯器中并不是一定要實現垃圾回收器。盡管如此,C++0x還是定義了垃圾回收器的功能。與此同時,C++0x還提供了應用程序二進制接口(ABI: Application Binary Interface)來輔助控制垃圾回收器的行為。 我們用“safely derived pointer”(3.7.3.3)(譯注:我搜索后發現,是在3.7.3.3而不是3.7.4.3講了safely derived pointer。這里可能是原文作者的筆誤)來表示指針和生存時間的規則;粗略地說就是 “指向由new分配的對象或者指向相應的子對象的指針”。 下面是一些關于“not safely derived pointers”又名“disguised pointers”,或者說是為便于正常人理解和認可你的程序從而你應該注意的一些問題。 * 將指針暫時指到別處: ``` int* p = new int; p+=10; //…垃圾回收器可能在這里運行… p-=10; //在此,我們是否可以肯定開始為p分配的那塊int內存還存在? *p = 10; ``` * 將指針隱藏到一個int變量中: ``` int* p = new int; int x = reinterpret_cast(p); // non-portable (不可移植) p=0; //…垃圾回收器可能在這里運行… p = reinterpret_cast(x); //在此,我們是否可以肯定開始為p分配的那塊int內存還存在? *p = 10; ``` * 還有更多甚至更危險的陷阱。比如I/O,以及將存儲不同的數據位打散,.. 雖然我們也有一些合理的理由來偽裝指針(例如:xor有可能在exceptionally memory-constrained applications中導致錯誤),但是理由并不像一些程序員所認為的那么多。 程序員可以在代碼中聲明哪些地方不會有指針被發現(比如在一個圖像中),也可以聲明哪些內存區域不能被回收,即使垃圾回收器發現沒有任何指針指向這塊內存區域。以下是相關的例子: void declare_reachable(void* p); //以p起始的內存區域 //(用能夠記住所分配內存區域大小 //的內存分配操作符分配)不能被回收 ``` template<class T> T* undeclared_reachable(T* p); void declare_no_pointers(char* p, size_t n); //p[0..n] 中沒有指針 void undeclared_no_poitners(char* p, size_t n); ``` 程序員要能夠查詢到關于指針安全和回收的規則是否是強制性的: ``` enum class pointer_saftety {relaxed, preferred, strict}; pointer_safety get_pointer_safety(); ``` 3.7.4.3[4]:滿足以下三個條件的行為沒有被定義:如果一個非”safely-derived pointer”值被釋放,并且它所引用的對象是動態存儲期(由new操作符動態創建并由delete銷毀的對象擁有動態存儲期),與此同時這個指針之前也沒被聲明為可到達的(20.7.13.7)。 * relaxed: safely-derived pointer和not safely-derived pointer被認為是等同的。這和C以及C++98中是一樣的。但這并不是我的初衷。我的想法是用戶如果沒有使用有效的指針指向一個對象則應啟用垃圾回收。 * Preferred:和relaxed類型一樣。只不過垃圾回收器可能被用作內存泄露檢測以及(或者)檢測對象是否被一個錯誤的指針解引用。 * strict: safely-derived和not safely-derive這兩種指針可能不再被等同。也就是說,垃圾回收器可能被啟用而且將會忽略那些not safely derived pointer。 并不存在任何標準化的方法以供你選擇任何一種。這是一個實現的質量(quality of implementation)和編程環境(programming environment)的問題。 另外,可以參考以下文獻: * the C++ draft 3.7.4.3 * the C++ draft 20.7.13.7 * Hans Boehm’s [GC page](http://www.hpl.hp.com/personal/Hans_Boehm/gc/) * Hans Boehm’s [Discussion of Conservative GC](http://www.hpl.hp.com/personal/Hans_Boehm/gc/issues.html) * [final proposal](http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2527.pdf) * Michael Spertus and Hans J. Boehm: [The Status of Garbage Collection in C++0X](http://portal.acm.org/citation.cfm?doid=1542431.1542437) . ACM ISMM’09. (翻譯:Yibo Zhu)
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看