我跑這個程序,但我沒有得到這個auto_ptr做什麼,並在哪些基礎知識顯示值?這個auto_ptr程序是如何工作的以及它做了什麼?
int main(int argc,char **argv)
{
int *i= new int;
auto_ptr<int> x(i);
auto_ptr<int>y;
y=x;
count <<x.get()<<endl;
count <<y.get()<<endl;
}
我跑這個程序,但我沒有得到這個auto_ptr做什麼,並在哪些基礎知識顯示值?這個auto_ptr程序是如何工作的以及它做了什麼?
int main(int argc,char **argv)
{
int *i= new int;
auto_ptr<int> x(i);
auto_ptr<int>y;
y=x;
count <<x.get()<<endl;
count <<y.get()<<endl;
}
此代碼將打印一個NULL地址用於第一auto_ptr的對象和一些非NULL地址用於第二,顯示源對象過程中損失的參考分配(=)。
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;
}
'* i'的值可能是垃圾,但是'auto_ptr <> :: get()'返回指針地址,所以垃圾永遠不會被「看到」。 – 2011-05-27 04:10:36
@Tony:足夠了 – 2011-05-27 04:20:56
「這可能會更透露一些」,是的......取消引用NULL指針 - 「*(x.get())」 - 揭示了各種各樣的東西...... ;-) – 2011-05-27 04:23:02
auto_ptr將對您構建指針的指針賦予所有權。
即。一旦auto_ptr本身被銷燬,它會自動銷燬指向的對象。
auto_ptr<int> x(i)
將使X自己我
auto_ptr<int> y
會讓Ÿ屬於自己的東西
您y=x
操作將轉移所有權,我從X *爲y
所以現在Ÿ擁有我和X擁有什麼都沒有,這意味着當x被破壞沒有任何反應,並且當y被破壞i被刪除
對於此程序,auto_ptr
是一樣,除了正常的指針:
delete
小號任何仍然指出太當它超出範圍因此,x
最初取值爲i
。然後y=x
有效地詢問x
忘掉i
(通過存儲NULL定點值來代替),並y
記住i
。然後打印由get返回將顯示NULL/0 x
的指針值和一個非空值(匹配i
)爲y
。然後如main()
返回,y
和x
保留範圍,並且由於y
保存的是非NULL指針值匹配i
,它將delete
int對象釋放堆內存。
感謝您提供的信息。 – 2011-05-27 04:13:55
@Viswanathan:不客氣。乾杯。 – 2011-05-27 04:20:41
auto_ptr
接管對象的所有權。需要注意的重要點是
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) {
....
}
.... + 1。在這個程序中正確 – Nawaz 2011-05-27 04:17:18