Разница между указателем и умным указателем - PullRequest
1 голос
/ 03 октября 2010

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

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

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

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

или что это за вопрос с подвохом.

Ответы [ 2 ]

6 голосов
/ 04 октября 2010

auto_ptr - это тип интеллектуального указателя, который работает при условии, что указатель принадлежит только одной стороне, и если эта сторона-владелец выходит из области видимости, указатель удаляется.

Когда вы передаете auto_ptr функции, вы «даете» функции указатель, и у вас ее больше нет.когда вы разыменовываете его, вы получаете поведение нулевого указателя (которое, конечно, не определено).

Для того, чтобы ваш код компилировался, вы должны немного изменить определение B, оно должно быть

auto_ptr<tClass> B = new tClass;

, так как auto_ptr не является типом (егошаблон типа), и вам вообще не нужен указатель на этот тип, так как класс перегружает это поведение.

3 голосов
/ 03 октября 2010

С ним что-то не так:

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