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

MyMSDN

MyMSDN記錄開發(fā)新知道

[翻譯]高效使用auto_ptr

本文來(lái)自C/C++用戶日志,17(10),1999年10月  原文鏈接

大部分人都聽說過auto_ptr指針,但是并非所有人都每天使用它。不使用它是不明智的(可恥的),因?yàn)閍uto_ptr的設(shè)計(jì)初衷是為了解決C++設(shè)計(jì)和編碼的普遍問題,將它用好可以寫出更健壯的代碼。本文指出如何正確使用auto_ptr以使程序變得安全,以及如何避開危險(xiǎn),而不是一般使用auto_ptr的惡習(xí)所致的創(chuàng)建間歇性和難以診斷的問題。

為什么它是一個(gè)“自動(dòng)”指針

auto_ptr只是許許多多智能指針中的一種。許多商業(yè)庫(kù)提供許多更強(qiáng)大的智能指針,可以完成更多的事情。從可以管理引用計(jì)數(shù)到提供更先進(jìn)的代理服務(wù)等。應(yīng)該把a(bǔ)uto_ptr認(rèn)為是智能指針中的福特Escort[注釋]:一個(gè)基于簡(jiǎn)單且通用目的的智能指針,既沒有小發(fā)明也沒有豐富的特殊目的更不需要高性能,但是能將許多普通的事情做好,并且能夠適合日常使用的智能指針。

auto_ptr做這樣一件事:擁有一個(gè)動(dòng)態(tài)分配內(nèi)存對(duì)象,并且在它不再需要的時(shí)候履行自動(dòng)清理的職責(zé)。這里有個(gè)沒有使用auto_ptr指針的不安全的例子:

    // Example 1(a): Original code
    //
    void f()
    {
      T* pt( new T );

      /*...more code...*/

      delete pt;
    }

我們每天都像這樣寫代碼,如果f()只是一個(gè)三行程序,也沒做什么多余的事情,這樣做當(dāng)然可以很好工作。但是如果f()沒有執(zhí)行delete語(yǔ)句,比如程序提前返回(return)了,或者在執(zhí)行的時(shí)候拋出異常了,然后就導(dǎo)致已經(jīng)分配的對(duì)象沒有被刪除,因此我們就有了一個(gè)經(jīng)典的內(nèi)存泄漏。

一個(gè)使Example(1)安全的辦法是用一個(gè)“智能”的指針擁有這個(gè)指針,當(dāng)銷毀的時(shí)候,刪除那個(gè)被指的自動(dòng)分配的對(duì)象。因?yàn)檫@個(gè)智能指針被簡(jiǎn)單地用為自動(dòng)對(duì)象(這就是,當(dāng)它離開它的作用域的時(shí)候自動(dòng)銷毀對(duì)象),所以它被稱作“自動(dòng)”指針。

    // Example 1(b): Safe code, with auto_ptr
    //
    void f()
    {
      auto_ptr<T> pt( new T );

      /*...more code...*/

    } // cool: pt's destructor is called as it goes out
      // of scope, and the object is deleted automatically

現(xiàn)在這段代碼將不會(huì)再T對(duì)象上發(fā)生泄漏了,不必在意這個(gè)方法是正常退出還是異常退出,因?yàn)閜t的析構(gòu)函數(shù)將總是在堆棧彈出的時(shí)候被調(diào)用。清理工作將自動(dòng)進(jìn)行。

最后,使用auto_ptr和使用內(nèi)建指針一樣地容易,如果要“收回”資源并且再次手動(dòng)管理的話,我們可以調(diào)用release():

    // Example 2: Using an auto_ptr
    //
    void g()
    {
      T* pt1 = new T;
      // right now, we own the allocated object

      // pass ownership to an auto_ptr
      auto_ptr<T> pt2( pt1 );

      // use the auto_ptr the same way
      // we'd use a simple pointer
      *pt2 = 12;       // same as "*pt1 = 12;"
      pt2->SomeFunc(); // same as "pt1->SomeFunc();"

      // use get() to see the pointer value
      assert( pt1 == pt2.get() );

      // use release() to take back ownership
      T* pt3 = pt2.release();

      // delete the object ourselves, since now
      // no auto_ptr owns it any more
      delete pt3;

    } // pt2 doesn't own any pointer, and so won't
      // try to delete it... OK, no double delete

最后,我們可以使用auto_ptr的reset()方法將auto_ptr重置向另一個(gè)對(duì)象。如果auto_ptr已經(jīng)獲得一個(gè)對(duì)象,這個(gè)過程就像是它先刪除已經(jīng)擁有的對(duì)象,因此調(diào)用reset(),就像是先銷毀了auto_ptr,然后重建了一個(gè)新的并擁有該新對(duì)象:

    // Example 3: Using reset()
    //
    void h()
    {
      auto_ptr<T> pt( new T(1) );

      pt.reset( new T(2) );
        // deletes the first T that was
        // allocated with "new T(1)"

    } // finally, pt goes out of scope and
      // the second T is also deleted

包裝指針數(shù)據(jù)成員

同樣,auto_ptr也可以被用于安全地包裝指針數(shù)據(jù)成員。考慮下面使用Pimpl idiom(或者,編譯器防火墻)的例子:[1]

    // Example 4(a): A typical Pimpl
    //

    // file c.h
    //
    class C
    {
    public:
      C();
      ~C();
      /*...*/
    private:
      class CImpl; // forward declaration
      CImpl* pimpl_;
    };

    // file c.cpp
    //
    class C::CImpl { /*...*/ };

    C::C() : pimpl_( new CImpl ) { }
    C::~C() { delete pimpl_; }

簡(jiǎn)單地說,就是C的私有細(xì)節(jié)被實(shí)現(xiàn)為一個(gè)單獨(dú)的對(duì)象,藏匿于一個(gè)指針之中。該思路要求C的構(gòu)造函數(shù)負(fù)責(zé)為隱藏在類內(nèi)部的輔助“Pimpl”對(duì)象分配內(nèi)存,并且C的析構(gòu)函數(shù)負(fù)責(zé)銷毀它。使用auto_ptr,我們會(huì)發(fā)現(xiàn)這非常容易:

    // Example 4(b): A safer Pimpl, using auto_ptr
    //

    // file c.h
    //
    class C
    {
    public:
      C();
      /*...*/
    private:
      class CImpl; // forward declaration
      auto_ptr<CImpl> pimpl_;
    };

    // file c.cpp
    //
    class C::CImpl { /*...*/ };

    C::C() : pimpl_( new CImpl ) { }

現(xiàn)在,析構(gòu)函數(shù)不需要擔(dān)心刪除pimpl_指針了,因?yàn)閍uto_ptr將自動(dòng)處理它。事實(shí)上,如果沒有其它需要顯式寫析構(gòu)函數(shù)的原因,我們完全不需要自定義析構(gòu)函數(shù)。顯然,這比手動(dòng)管理指針要容易得多,并且將對(duì)象所有權(quán)包含進(jìn)對(duì)象是一個(gè)不錯(cuò)的習(xí)慣,這正是auto_ptr所擅長(zhǎng)的。我們將在最后再次回顧這個(gè)例子。

所有權(quán),源,以及調(diào)用者(Sinks)

它本身很漂亮,并且做得非常好:從函數(shù)傳入或傳出auto_ptrs,是非常有用的,比如函數(shù)的參數(shù)或者返回值。

讓我們看看為什么,首先我們考慮當(dāng)拷貝auto_ptr的時(shí)候會(huì)發(fā)生什么:一個(gè)auto_ptr獲得一個(gè)擁有指針的對(duì)象,并且在同一時(shí)間只允許有一個(gè)auto_ptr可以擁有這個(gè)對(duì)象。當(dāng)你拷貝一個(gè)auto_ptr的時(shí)候,你自動(dòng)將源auto_ptr的所有權(quán),傳遞給目標(biāo)auto_ptr;如果目標(biāo)auto_ptr已經(jīng)擁有了一個(gè)對(duì)象,這個(gè)對(duì)象將先被釋放。在拷貝完之后,只有目標(biāo)auto_ptr擁有指針,并且負(fù)責(zé)在合適的時(shí)間銷毀它,而源將被設(shè)置為空(null),并且不能再被當(dāng)作原有指針的代表來(lái)使用。

例如:

    // Example 5: Transferring ownership from
    //            one auto_ptr to another
    //
    void f()
    {
      auto_ptr<T> pt1( new T );
      auto_ptr<T> pt2;

      pt1->DoSomething(); // OK

      pt2 = pt1;  // now pt2 owns the pointer,
                  // and pt1 does not

      pt2->DoSomething(); // OK

    } // as we go out of scope, pt2's destructor
      // deletes the pointer, but pt1's does nothing

但是要避免陷阱再次使用已經(jīng)失去所有權(quán)的auto_ptr:

    // Example 6: Never try to do work through
    //            a non-owning auto_ptr
    //
    void f()
    {
      auto_ptr<T> pt1( new T );
      auto_ptr<T> pt2;

      pt2 = pt1;  // now pt2 owns the pointer, and
                  // pt1 does not

      pt1->DoSomething();
                  // error! following a null pointer
    }

謹(jǐn)記于心,我們現(xiàn)在看看auto_ptr如何在源和調(diào)用者之間工作。“源”這里是指一個(gè)函數(shù),或者其它創(chuàng)建一個(gè)新資源的操作,并且通常將移交出資源的所有權(quán)。一個(gè)“調(diào)用者”函數(shù)反轉(zhuǎn)這個(gè)關(guān)系,也就是獲得已經(jīng)存在對(duì)象的所有權(quán)(并且通常還負(fù)責(zé)釋放它)。而不是有一個(gè)源和調(diào)用者,返回并且利用一個(gè)禿頭指針(譯者注:而不是使用一個(gè)局部變量來(lái)傳遞這個(gè)指針),雖然,通過一個(gè)禿頭指針來(lái)獲得一個(gè)資源通常很好:

    // Example 7: Sources and sinks
    //

    // A creator function that builds a new
    // resource and then hands off ownership.
    //
    auto_ptr<T> Source()
    {
      return auto_ptr<T>( new T );
    }

    // A disposal function that takes ownership
    // of an existing resource and frees it.
    //
    void Sink( auto_ptr<T> pt )
    {
    }

    // Sample code to exercise the above:
    auto_ptr<T> pt( Source() ); // takes ownership

注意下面的微妙的變化:

  1. Source()分配了一個(gè)新對(duì)象并且以一個(gè)完整安全的方式將它返回給調(diào)用者,并讓調(diào)用者成為指針的擁有著。即使調(diào)用者忽略了返回值(顯然,如果調(diào)用者忽略了返回值,你應(yīng)該從來(lái)沒有寫過代碼來(lái)刪除這個(gè)對(duì)象,對(duì)吧?),分配的對(duì)象也將被自動(dòng)安全地刪除。

    在本文的最后,我將演示返回一個(gè)auto_ptr是一個(gè)好習(xí)慣。讓返回值包裹進(jìn)一些東西比如auto_ptr通常是使得函數(shù)變得強(qiáng)健的有效方式。

  2. Sink()通過傳值的方式獲得對(duì)象所有權(quán)。當(dāng)執(zhí)行完Sink()的時(shí)候,當(dāng)離開作用域的時(shí)候,刪除操作將被執(zhí)行(只要Sink()沒有將所有權(quán)轉(zhuǎn)移)。上面所寫的Sink()函數(shù)實(shí)際上并沒有對(duì)參數(shù)做任何事情,因此調(diào)用“Sink(pt);”就等于寫了“pt.reset(0);”,但是大部分的Sink函數(shù)都將在釋放它之前做一些工作。

不可以做的事情,以及為什么不能做

謹(jǐn)記:千萬(wàn)不要以我之前沒有提到的方式使用auto_ptrs。我已經(jīng)看見過很多程序員試著用其他方式寫auto_ptrs就像他們?cè)谑褂闷渌鼘?duì)象一樣。但問題是auto_ptr并不像其他對(duì)象。這里有些基本原則,我將把它們提出來(lái)以引起你的注意:

For auto_ptr, copies are NOT equivalent. (復(fù)制auto_ptr將與原來(lái)的不相等)

當(dāng)你試著在一般的代碼中使用auto_ptrs的時(shí)候,它將執(zhí)行拷貝,并且沒有任何提示,拷貝是不相等的(結(jié)果,它確實(shí)就是拷貝)。看下面這段代碼,這是我在C++新聞組經(jīng)常看見的:

    // Example 8: Danger, Will Robinson!
    //
    vector< auto_ptr<T> > v;

    /* ... */

    sort( v.begin(), v.end() );

在標(biāo)準(zhǔn)容器中使用auto_ptrs總是不安全的。一些人可能要告訴你,他們的編譯器或者類庫(kù)能夠很好地編譯它們,而另一些人則告訴你在某一個(gè)流行的編譯器的文檔中看到這個(gè)例子,不要聽他們的。

問題是auto_ptr并不完全符合一個(gè)可以放進(jìn)容器類型的前提,因?yàn)榭截?span style="font-family: 'Courier New'" class="Code">auto_ptrs是不等價(jià)的。首先,沒有任何東西說明,vector不能決定增加并制造出“擴(kuò)展”的內(nèi)部拷貝。再次,當(dāng)你調(diào)用一個(gè)一般函數(shù)的時(shí)候,它可能會(huì)拷貝元素,就像sort()那樣,函數(shù)必須有能力假設(shè)拷貝是等價(jià)的。至少一個(gè)流行的排序拷貝“核心”的元素,如果你試著讓它與auto_ptrs一起工作的話,它將拷貝一份“核心”的auto_ptr對(duì)象(因此轉(zhuǎn)移所有權(quán)并且將所有權(quán)轉(zhuǎn)移給一個(gè)臨時(shí)對(duì)象),然后對(duì)其余的元素也采取相同的方式(從現(xiàn)有成員創(chuàng)建更多的擁有所有權(quán)的auto_ptr),當(dāng)排序完成后,核心元素將被銷毀,并且你將遇到一個(gè)問題:這組序列里至少一個(gè)auto_ptr(也就是剛才被掉包的那個(gè)核心元素)不再擁有對(duì)象所有權(quán),而那個(gè)真實(shí)的指針已經(jīng)隨著臨時(shí)對(duì)象的銷毀而被刪除了!

于是標(biāo)準(zhǔn)委員會(huì)回退并希望做一些能夠幫助你避免這些行為的事情:標(biāo)準(zhǔn)的auto_ptr被故意設(shè)計(jì)成當(dāng)你希望在使用標(biāo)準(zhǔn)容器的時(shí)候使用它時(shí)打斷你(或者,至少,在大部分的標(biāo)準(zhǔn)庫(kù)實(shí)現(xiàn)中打斷你)。為了達(dá)到這個(gè)目的,標(biāo)準(zhǔn)委員會(huì)利用這樣一個(gè)技巧:讓auto_ptr's的拷貝構(gòu)造函數(shù)和賦值操作符的右值(rhs)指向非常量。因?yàn)闃?biāo)準(zhǔn)容器的單元素insert()函數(shù),需要一個(gè)常量作為參數(shù),因此auto_ptrs在這里就不工作了。(譯者注:右值不能賦值給非常量)

使用const auto_ptr是一個(gè)好習(xí)慣

將一個(gè)auto_ptr設(shè)計(jì)成const auto_ptrs將不再丟失所有權(quán):拷貝一個(gè)const auto_ptr是違法的(譯者注:沒有這樣的構(gòu)造函數(shù)),實(shí)際上你可以針對(duì)它做的唯一事情就是通過operator*()或者operator->()解引用它或者調(diào)用get()來(lái)獲得所包含的指針的值。這意味著我們有一個(gè)簡(jiǎn)單明了的風(fēng)格來(lái)表達(dá)一個(gè)絕不丟失所有權(quán)的auto_ptr:

    // Example 9: The const auto_ptr idiom
    //
    const auto_ptr<T> pt1( new T );
        // making pt1 const guarantees that pt1 can
        // never be copied to another auto_ptr, and
        // so is guaranteed to never lose ownership

    auto_ptr<T> pt2( pt1 ); // illegal
    auto_ptr<T> pt3;
    pt3 = pt1;              // illegal
    pt1.release();          // illegal
    pt1.reset( new T );     // illegal

這就是我要說的cosnt!因此如果現(xiàn)在你要向世界證明你的auto_ptr是不會(huì)被改變并且將總是刪除其所有權(quán),加上const就是你要做的。const auto_ptr風(fēng)格是有用的,你必須將它謹(jǐn)記于心。

auto_ptr以及異常安全

最后,auto_ptr對(duì)寫出異常安全的代碼有時(shí)候非常必要,思考下面的代碼:

    // Example 10(a): Exception-safe?
    //
    String f()
    {
      String result;
      result = "some value";
      cout << "some output";
      return result;
    }

該函數(shù)有兩個(gè)可見的作用:它輸出一些內(nèi)容,并且返回一個(gè)String。關(guān)于異常安全的詳細(xì)說明超出了本文的范圍[2],但是我們想要取得的目標(biāo)就是強(qiáng)異常安全的保障,歸結(jié)為確保函數(shù)的原子性——如果有異常,所有的作用一起發(fā)生或者都不發(fā)生。

雖然在例10(a)中的代碼非常精巧,看起來(lái)相當(dāng)接近于異常安全的代碼,但仍然有一些小的瑕疵,就像下面的客戶代碼所示:

    String theName;
    theName = f();

因?yàn)榻Y(jié)果通過值返回,因此String的拷貝構(gòu)造函數(shù)將被調(diào)用,而拷貝賦值操作符被調(diào)用來(lái)將結(jié)果拷貝到theName中。如果任何一個(gè)拷貝失敗了,f()就完成了所有它的工作以及所有它的任務(wù)(這很好),但是結(jié)果是無(wú)法挽回的(哎喲我的媽呀)

我們可以做的更好嗎,是否可以通過避免拷貝來(lái)避免這個(gè)問題?例如,我們可以 讓函數(shù)有一個(gè)非常量引用參數(shù)并向下面這樣返回值:

    // Example 10(b): Better?
    //
    void f( String& result )
    {
      cout << "some output";
      result = "some value";
    }

這看起來(lái)很棒,但實(shí)際不是這樣的,返回result的賦值的函數(shù)只完成了一個(gè)功能,而將其它事情留給了我們。它仍然會(huì)出錯(cuò)。因此這個(gè)做法不可取。

解決這個(gè)問題的一個(gè)方法是返回一個(gè)指向動(dòng)態(tài)分配指針的String對(duì)象,但是最好的解決方案是讓我們做的更多,返回一個(gè)指針包含在auto_ptr:

    // Example 10(c): Correct (finally!)
    //
    auto_ptr<String> f()
    {
      auto_ptr<String> result = new String;
      *result = "some value";
      cout << "some output";
      return result;  // rely on transfer of ownership;
                      // this can't throw
    }

這里是一個(gè)技巧,當(dāng)我們有效隱藏所有的工作來(lái)構(gòu)造第二個(gè)功能(返回值)當(dāng)確保它可以被安全返回給調(diào)用者并且在第一個(gè)功能(打印消息)完成的時(shí)候沒有拋出操作。我們知道一旦cout完成,返回值將成功交到調(diào)用者手中,并且無(wú)論如何都會(huì)正確清理:如果調(diào)用者接受返回值,調(diào)用者將得到這個(gè)拷貝的auto_ptr臨時(shí)對(duì)象的所有權(quán);如果調(diào)用者沒有接受返回值,也就是忽略返回值,分配的String將在臨時(shí)auto_ptr被銷毀的時(shí)候自動(dòng)清理。這種安全擴(kuò)展的代價(jià)呢?就像我們經(jīng)常實(shí)現(xiàn)的強(qiáng)異常安全一樣,強(qiáng)安全通常消耗一些效率(通常比較小)——這里指額外的動(dòng)態(tài)內(nèi)存分配。但是當(dāng)我們?cè)谛屎驼_性之間做出選擇的話,我們通常會(huì)選擇后者!

讓我們養(yǎng)成在日常工作中使用auto_ptr的習(xí)慣。auto_ptr解決了常見的問題,并且能夠使你的代碼變得更安全和健壯,特別是它可以防止內(nèi)存泄漏以及確保強(qiáng)安全。因?yàn)樗菢?biāo)準(zhǔn)的,因此它在不同類庫(kù)和平臺(tái)之間是可移植的,因此無(wú)論你在哪里使用它,它都將是對(duì)的。

致謝

This article is drawn from material in the new book Exceptional C++: 47 engineering puzzles, programming problems, and exception-safety solutions by Herb Sutter, ? 2000 Addison Wesley Longman Inc., which contains further detailed treatments of points touched on briefly in this article, including exception safety, the Pimpl (compiler-firewall) Idiom, optimization, const-correctness, namespaces, and other C++ design and programming topics.

注釋

  1. Pimpl風(fēng)格可以有效減少項(xiàng)目構(gòu)建時(shí)間,因?yàn)樗贑私有部分改變的時(shí)候,阻止客戶代碼引起廣泛的重新編譯。更多關(guān)于Pimpl風(fēng)格以及如何部署編譯器墻,參考這本Exceptional C++的條款26到30。(Addison-Wesley, 2000)

  2. See the article originally published in C++ Report and available on the Effective C++ CD (Scott Meyers, Addison-Wesley, 1999) and Items 8 to 19 in Exceptional C++ (Herb Sutter, Addison-Wesley, 2000).

posted on 2010-04-07 19:08 volnet 閱讀(3663) 評(píng)論(10)  編輯 收藏 引用 所屬分類: 知識(shí)庫(kù)(KnowledgeLibrary)C/C++

評(píng)論

# re: [翻譯]高效使用auto_ptr 2010-04-07 20:05 giscn

最好遠(yuǎn)離 auto_ptr, 這個(gè)東西引進(jìn)來(lái)的問題比解決的問題多  回復(fù)  更多評(píng)論   

# re: [翻譯]高效使用auto_ptr 2010-04-07 20:32 唐風(fēng)

@giscn
給些例子或是一些鏈接不咧
我贊同本文的觀點(diǎn),但同時(shí)很想知道“遠(yuǎn)離 auto_ptr” 的理由是否也能說明我。

謝謝了。

  回復(fù)  更多評(píng)論   

# re: [翻譯]高效使用auto_ptr 2010-04-08 13:02 Benjamin

什么時(shí)候用?該怎樣用?這是關(guān)鍵  回復(fù)  更多評(píng)論   

# re: [翻譯]高效使用auto_ptr 2010-04-08 13:40 giscn

首先如果要解決語(yǔ)句局部的內(nèi)存自動(dòng)回收,auto_ptr 采用了RAII的做法,這樣很好,應(yīng)該就到此為止,那些reset, release函數(shù)都不必引入,使用也很簡(jiǎn)單。
但是:auto_ptr很顯然想解決更廣范圍的內(nèi)存回收,比如:一個(gè)指針在多個(gè)容器里,因此它引入了“所有權(quán)”、“源”這幾個(gè)概念,其實(shí),有COM開發(fā)的經(jīng)驗(yàn)的人應(yīng)該很熟悉這個(gè)概念,典型的,BSTR的創(chuàng)建與銷毀規(guī)則就是這種思路,這個(gè)概念帶來(lái)的麻煩COM開發(fā)人員是清楚的,我覺得歸根結(jié)底,在這種情況下,所有權(quán)不是那么容易分辨,舉例說明一下:一個(gè)指針保存在兩個(gè)容器中,那么哪一個(gè)是有所有權(quán)呢?更糟糕的是auto_ptr利用了常用的賦值語(yǔ)義來(lái)確定所有權(quán),首先,它改變了賦值操作的習(xí)慣,常規(guī)的,a=b之后,b依然是有效的,而 auto_ptr卻讓b是無(wú)效的,這個(gè)就是是問題的根源。
其所要解決的問題根本沒有解決,你依然無(wú)法確定指針的所有權(quán)應(yīng)該在那個(gè)容器中、何時(shí)銷毀。即使你清楚地知道,一個(gè)小的疏忽:賦值的順序就會(huì)引入bug。
好與不好,自己實(shí)踐、體會(huì)最重要。  回復(fù)  更多評(píng)論   

# re: [翻譯]高效使用auto_ptr 2010-04-08 14:10 volnet

@Benjamin
這就是這篇文章的主題啊,除了之前提到過的幾種形式,就不應(yīng)該發(fā)明其它形式了……  回復(fù)  更多評(píng)論   

# re: [翻譯]高效使用auto_ptr 2010-04-09 03:22 欲三更

我覺得auto_ptr是C++里面典型的“因?yàn)樵O(shè)想太過宏偉,從而產(chǎn)生問題”的范例。

事實(shí)上大多數(shù)人為什么會(huì)想到用一個(gè)包裝過的指針?害怕內(nèi)存泄漏。那么我們需要的就是一個(gè)確定會(huì)在某一個(gè)域結(jié)束時(shí)把自身攜帶對(duì)象析構(gòu)掉的指針,就這么簡(jiǎn)單。那么我們就實(shí)現(xiàn)一個(gè)沒有賦值功能的auto_ptr就好了,一了百了。

而且我覺得這里面有一個(gè)邏輯問題:假設(shè)我們?cè)诖罄ㄌ?hào)開始處建立一個(gè)攜帶對(duì)象的指針,并且確定在大括號(hào)結(jié)束的時(shí)候?qū)ο髸?huì)析構(gòu)掉,那我們有什么理由把它傳遞給大括號(hào)之外的代碼呢?  回復(fù)  更多評(píng)論   

# re: [翻譯]高效使用auto_ptr 2010-04-09 10:42 volnet

@欲三更
這就是應(yīng)該象是:
// stack <- dumb pointer
// dump pointer -> do()
// dump pointer -> hello();
// stack -> delete dumb pointer auto

該干嘛讓他自己干嘛去,我們要做的無(wú)非就是將指針在開始的時(shí)候交給棧可管理的對(duì)象去管理……然后繼續(xù)放任自由……  回復(fù)  更多評(píng)論   

# re: [翻譯]高效使用auto_ptr 2010-04-10 04:07 dui

please use smart pointer  回復(fù)  更多評(píng)論   

# re: [翻譯]高效使用auto_ptr 2010-04-12 00:12 anonymous

認(rèn)識(shí)auto_ptr的作用及局限性,合理使用。不要?jiǎng)硬粍?dòng)就遠(yuǎn)離,不存在一個(gè)完美的東西可以解決所有的問題。  回復(fù)  更多評(píng)論   

# re: [翻譯]高效使用auto_ptr 2010-08-29 17:32 evening dresses

都每天使用它  回復(fù)  更多評(píng)論   

特殊功能
 
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            亚洲午夜精品一区二区| 国产精品亚洲一区二区三区在线| 亚洲欧洲一区二区在线观看| 久久网站免费| 亚洲一区黄色| 久久久精品性| 亚洲欧美中文另类| 欧美激情aaaa| 国产精品高清在线| 亚洲承认在线| 欧美大胆人体视频| 国产精品sss| 亚洲国产天堂久久综合| 国产精品一区二区a| 亚洲国产欧美在线人成| 亚洲欧美综合网| 91久久久一线二线三线品牌| 亚洲精品男同| 亚洲欧洲中文日韩久久av乱码| 欧美影院成年免费版| 久久婷婷久久| 国产精品久久777777毛茸茸| 久久精品视频99| 国产精品乱码妇女bbbb| 日韩一级片网址| 免费在线视频一区| 久久国产欧美日韩精品| 国产乱码精品一区二区三区不卡| 一本久久精品一区二区| 欧美激情综合色| 中文网丁香综合网| 欧美日韩一区二区国产| 亚洲免费在线电影| 国产精品xvideos88| 午夜精品理论片| 久久这里有精品视频| 最近中文字幕日韩精品| 欧美美女喷水视频| 亚洲私人影院| 免费观看一级特黄欧美大片| 亚洲第一中文字幕| 欧美国产一区二区在线观看 | 亚洲新中文字幕| 欧美日韩欧美一区二区| 亚洲性色视频| 狂野欧美激情性xxxx| 欧美日韩中文精品| 欧美在线日韩精品| 亚洲国产精品999| 亚洲午夜视频在线观看| 久久综合综合久久综合| 亚洲午夜影视影院在线观看| 国产性色一区二区| 欧美日韩一区二区三区四区在线观看| 亚洲欧美日韩爽爽影院| 亚洲成人资源| 国产精品伦一区| 国产一区二区三区在线观看免费视频| 久久天天躁狠狠躁夜夜爽蜜月| 欧美日韩在线三区| 欧美大片免费观看| 久久免费高清视频| 久久精品在线视频| 欧美在线观看视频在线| 国产精品嫩草久久久久| 99视频一区二区| 91久久精品日日躁夜夜躁欧美| 亚洲国产日韩在线一区模特| 国产欧美日韩在线观看| 国产午夜精品视频| 欧美影院成年免费版| 欧美一区日韩一区| 久久一区二区三区av| 亚洲欧洲日韩综合二区| 亚洲国产一区二区精品专区| 亚洲精品乱码久久久久久日本蜜臀 | 亚洲啪啪91| 欧美激情bt| 99v久久综合狠狠综合久久| 亚洲精品三级| 欧美一区网站| 欧美巨乳在线| 激情视频一区二区三区| 日韩午夜一区| 久久se精品一区精品二区| 欧美成人一区在线| 国产精品99久久久久久www| 亚洲欧美日韩精品久久亚洲区| 久久综合中文色婷婷| 日韩午夜在线播放| 久久午夜影视| 国产区亚洲区欧美区| 在线亚洲免费| 夜夜狂射影院欧美极品| 亚洲免费视频中文字幕| 日韩午夜电影在线观看| 久久久久久久久久久一区| 欧美三级电影大全| 亚洲精品视频二区| 免费91麻豆精品国产自产在线观看| 亚洲网站在线播放| 亚洲人成网站999久久久综合 | 久久亚洲精品一区二区| 亚洲影视九九影院在线观看| 欧美另类视频| 一区二区三区四区在线| 一本色道久久综合亚洲精品高清| 欧美大尺度在线观看| 久久亚洲欧美| 在线视频精品一区| 亚洲主播在线播放| 国产精品免费看| 国产精品日韩欧美大师| 午夜精品剧场| 另类尿喷潮videofree| 亚洲福利一区| 中日韩男男gay无套| 亚洲免费影院| 亚洲丶国产丶欧美一区二区三区 | 欧美一区亚洲一区| 午夜一级久久| 欧美一区二区视频在线观看2020| 久久福利视频导航| 亚洲欧洲日本一区二区三区| 一本久久综合亚洲鲁鲁| 欧美一区二区精美| 1769国内精品视频在线播放| 亚洲乱码国产乱码精品精可以看| 亚洲欧美国产制服动漫| 在线看片一区| 午夜精品视频在线观看一区二区| 久久久午夜视频| 羞羞漫画18久久大片| 玖玖玖免费嫩草在线影院一区| 91久久黄色| 国产一区二区三区在线观看视频| 亚洲国产欧美一区二区三区丁香婷| 亚洲免费在线电影| 欧美激情欧美狂野欧美精品| 久久久亚洲高清| 亚洲欧美另类在线观看| 亚洲女女做受ⅹxx高潮| 欧美日本在线看| 亚洲人成7777| 99v久久综合狠狠综合久久| 欧美高清视频在线观看| 欧美顶级艳妇交换群宴| 亚洲第一级黄色片| 女女同性精品视频| 亚洲麻豆一区| 亚洲欧美日韩成人| 国产日韩欧美不卡| 久久人人爽爽爽人久久久| 免费亚洲电影在线| 91久久国产综合久久91精品网站| 免费在线成人| 99re6热在线精品视频播放速度| 亚洲伦伦在线| 欧美一区二区精美| 免费久久99精品国产自| 亚洲——在线| 好吊成人免视频| 欧美精品少妇一区二区三区| 亚洲伊人久久综合| 亚洲第一色中文字幕| 午夜精品在线观看| 99国产精品视频免费观看| 国产伦理精品不卡| 欧美视频日韩视频在线观看| 欧美一区二区三区在线免费观看| 一区二区免费在线视频| 国产乱码精品| 亚洲性图久久| 亚洲欧洲一区二区天堂久久 | 久久裸体艺术| 国产欧美一区二区白浆黑人| 欧美精品97| 欧美激情一二三区| 亚洲激情一区| 欧美国产亚洲精品久久久8v| 久久国产精品久久久| 亚洲一区二区三区四区五区午夜| 亚洲精品女人| 亚洲人成毛片在线播放| 精品不卡视频| 1024成人网色www| 亚洲高清在线播放| 亚洲欧洲一区二区三区在线观看| 久久精品日韩| 久久综合一区二区| 日韩视频免费观看高清完整版| 日韩视频精品| 亚洲伊人伊色伊影伊综合网| 亚洲视频免费看| 久久国产天堂福利天堂| 国产夜色精品一区二区av| 另类专区欧美制服同性| 欧美mv日韩mv国产网站app| 欧美色123| 在线日韩中文字幕|