2011-05-27 91 views

回答

8

此代碼將打印一個NULL地址用於第一auto_ptr的對象和一些非NULL地址用於第二,顯示源對象過程中損失的參考分配(=)。

+0

.... + 1。在這個程序中正確 – Nawaz 2011-05-27 04:17:18

1

auto_ptr自動釋放在其範圍的端部通過new分配的內存(在此情況下,當主退出)。然而這個例子相當愚蠢,因爲整數從來沒有收到實際的值,所以我必須想象你看到了垃圾。

這可能是多一點揭示:

int main(int argc,char **argv) 
{ 
    int *i= new int; 
    *i = 5; 
    auto_ptr<int> x(i); 
    auto_ptr<int>y; 

    y=x; 

    count << *(x.get()) <<endl; 
    count << *(y.get()) <<endl; 

    *x.get() = 7; 

    count << *(x.get()) <<endl; 
    count << *(y.get()) <<endl; 
} 
+0

'* i'的值可能是垃圾,但是'auto_ptr <> :: get()'返回指針地址,所以垃圾永遠不會被「看到」。 – 2011-05-27 04:10:36

+0

@Tony:足夠了 – 2011-05-27 04:20:56

+0

「這可能會更透露一些」,是的......取消引用NULL指針 - 「*(x.get())」 - 揭示了各種各樣的東西...... ;-) – 2011-05-27 04:23:02

1

簡而言之,auto_ptr是一個模板對象,當它的變量超出範圍時,它的析構函數會被調用並釋放它獲取的內存。這是智能指針的更簡單版本之一。

+0

他們沒有析構函數? – 2011-05-27 04:09:16

+0

@Viswanathan,'auto_ptr'本身就是一個類,當'auto_ptr'(這裏'x'和'y')聲明的對象超出函數的範圍時,它們的析構函數被調用。請參閱我的答案中的鏈接,瞭解更多鏈接 – iammilind 2011-05-27 04:11:04

+0

以及鏈接。 – 2011-05-27 04:14:11

1

auto_ptr將對您構建指針的指針賦予所有權。

即。一旦auto_ptr本身被銷燬,它會自動銷燬指向的對象。

auto_ptr<int> x(i)將使X自己我

auto_ptr<int> y會讓Ÿ屬於自己的東西

y=x操作將轉移所有權,我從X *爲y

所以現在Ÿ擁有我和X擁有什麼都沒有,這意味着當x被破壞沒有任何反應,並且當y被破壞i被刪除

1

對於此程序,auto_ptr是一樣,除了正常的指針:

  • delete小號任何仍然指出太當它超出範圍
  • ,如果你從一個auto_ptr的對象複製到另一個對象的複製,從對象會「忘記」它一直對象跟蹤

因此,x最初取值爲i。然後y=x有效地詢問x忘掉i(通過存儲NULL定點值來代替),並y記住i。然後打印由get返回將顯示NULL/0 x的指針值和一個非空值(匹配i)爲y。然後如main()返回,yx保留範圍,並且由於y保存的是非NULL指針值匹配i,它將delete int對象釋放堆內存。

+0

感謝您提供的信息。 – 2011-05-27 04:13:55

+0

@Viswanathan:不客氣。乾杯。 – 2011-05-27 04:20:41

0

auto_ptr接管對象的所有權。需要注意的重要點是

  • 它會刪除內部舉行的對象
  • 複製/分配的auto_ptr所有權轉移
  • 它會在C棄用++ 0x中,取而代之的是unique_ptr

由於這些原因,它傾向於與RAII(資源獲取是初始化)範式結合使用。例如,假設你分配了一個變量而不將它存儲在auto_ptr中,那麼你將不得不自己管理內存的刪除。下面的例子表明,這必須做兩次,一次爲好路徑,一次爲失敗路徑。

A* p(new A); 
try { 
    .... 
} 
catch (std::exception& e) { 
    delete p; 
    return; 
} 
delete p; 

如果我們使用auto_ptr代替它,我們不得不記得刪除分配的內存。

auto_ptr<A> p(new A); 
try { 
    .... 
} 
catch (std::exception& e) { 
    .... 
} 
相關問題