2010-10-03 192 views
1

你能告訴我這段代碼有什麼問題嗎?我被問這個在接受採訪時,我不知道什麼地方錯了指針和智能指針的區別

tClass是一個測試類,打印tClass成員的方法printSomething。

tClass * A = new tClass(); 
f(A); 
A->printSomething(); 

auto_ptr<tClass> * B = new tClass(); 
f(B); 
B-> printSomething(); 

或這是一個詭計的問題。

+3

這可能聽起來愚蠢:什麼是函數f()? – beta0x64 2010-10-03 19:59:36

+1

太添加到ChrisW,'F'可能不接受'auto_ptr'參數和'auto_ptr'不轉換爲原生指針,所以你需要'F(B.get())'。 – Potatoswatter 2010-10-03 20:04:03

+1

如果f是'template void f(T ptr){ptr-> printSomething(); }'? – SingleNegationElimination 2010-10-03 20:09:16

回答

6

auto_ptr的是一種智能指針的那恰好一方擁有指針的前提下進行操作的正確類型的,並且如果擁有它派對超出範圍,指針被刪除。

當你傳遞一個auto_ptr的功能,你是「給予」的功能指針,所以你不要它了。當你解引用它時,你會得到一個空指針行爲(當然這是未定義的)。

爲了讓你的代碼進行編譯,但是,你必須改變你的B定義了一下,應該是

auto_ptr<tClass> B = new tClass; 

因爲auto_ptr的是不是一個類型(其類型模板),和你實際上並不需要一個指向該類型的指針,因爲類會重載這些行爲。

+1

可能是要提的是'auto_ptr'是贊成'unique_ptr'的棄用:http://stackoverflow.com/questions/2404115/is-auto-ptr-deprecated。另外,'tClass'真的需要一對圓括號嗎? – Arun 2010-10-03 22:40:05

+1

@ArunSaha:它不被棄用*尚未*。 C++ 0x尚未標準:) – jalf 2010-10-03 22:59:05

+1

「將auto_ptr傳遞給函數時......」僅適用於按值傳遞; f()可能會接受對auto_ptr的引用。 – 2010-10-04 09:03:02

3

事情不妥:

  • 一個永遠不會被刪除。
  • f未被聲明。
  • 乙方應可能是auto_ptr<tClass>類型。
  • new tClass()tClass*類型,是不是分配給B.