2010-10-03 4 views
1

Можете ли вы рассказать мне, что не так с этим фрагментом кода? Меня спросили об этом в интервью, и я не уверен, что с ним не так.Разница между указателем и умным указателем

tClass - это тестовый класс с методом printSomething, который печатает члены tClass.

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

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

или что это за трюк.

+3

Это может показаться глупым: что такое функция f()? – beta0x64

+1

Too add to ChrisW, 'f', вероятно, не принимает аргумент' auto_ptr', а 'auto_ptr' не преобразуется в собственный указатель, поэтому вам нужно' f (B.get()) '. – Potatoswatter

+1

что если f является 'template void f (T ptr) {ptr-> printSomething(); } '? – SingleNegationElimination

ответ

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

+1

@ArunSaha: он не устарел * еще *. C++ 0x еще не является стандартным :) – jalf

+1

«Когда вы передаете auto_ptr в функцию ...», это верно только для прохода по значению; f() может принять ссылку на auto_ptr. –

3

вещи неправильно с ним:

  • никогда не удаляются.
  • f не заявлен.
  • B, должно быть, должно быть типа auto_ptr<tClass>.
  • new tClass() имеет тип tClass*, который не является правильным типом для назначения В.