你能告訴我這段代碼有什麼問題嗎?我被問這個在接受採訪時,我不知道什麼地方錯了指針和智能指針的區別
tClass是一個測試類,打印tClass成員的方法printSomething。
tClass * A = new tClass();
f(A);
A->printSomething();
auto_ptr<tClass> * B = new tClass();
f(B);
B-> printSomething();
或這是一個詭計的問題。
你能告訴我這段代碼有什麼問題嗎?我被問這個在接受採訪時,我不知道什麼地方錯了指針和智能指針的區別
tClass是一個測試類,打印tClass成員的方法printSomething。
tClass * A = new tClass();
f(A);
A->printSomething();
auto_ptr<tClass> * B = new tClass();
f(B);
B-> printSomething();
或這是一個詭計的問題。
auto_ptr的是一種智能指針的那恰好一方擁有指針的前提下進行操作的正確類型的,並且如果擁有它派對超出範圍,指針被刪除。
當你傳遞一個auto_ptr的功能,你是「給予」的功能指針,所以你不要它了。當你解引用它時,你會得到一個空指針行爲(當然這是未定義的)。
爲了讓你的代碼進行編譯,但是,你必須改變你的B
定義了一下,應該是
auto_ptr<tClass> B = new tClass;
因爲auto_ptr的是不是一個類型(其類型模板),和你實際上並不需要一個指向該類型的指針,因爲類會重載這些行爲。
事情不妥:
auto_ptr<tClass>
類型。new tClass()
是tClass*
類型,是不是分配給B.
這可能聽起來愚蠢:什麼是函數f()? – beta0x64 2010-10-03 19:59:36
太添加到ChrisW,'F'可能不接受'auto_ptr'參數和'auto_ptr'不轉換爲原生指針,所以你需要'F(B.get())'。 – Potatoswatter 2010-10-03 20:04:03
如果f是'template void f(T ptr){ptr-> printSomething(); }'? –
SingleNegationElimination
2010-10-03 20:09:16