Все зависит от того, что такое ExportAnimation
и как оно реализовано.
Использует ли он только объект во время вызова, а затем оставляет его?
Затем преобразует в ссылку и передает реальную ссылку.Нет необходимости передавать членство, и аргумент не является обязательным, поэтому достаточно void ExportAnimation( CAnimation const & )
.Преимущество состоит в том, что из интерфейса ясно, что у метода нет проблем с управлением памятью, он просто использует переданный объект и оставляет его как таковой.В этом случае передача необработанного указателя (как в предложенном вами коде) намного хуже, чем передача ссылки, поскольку неясно, отвечает ли ExportAnimation
за удаление переданного объекта.
Сохраняет ли он объект для последующего использования?
Это может быть в том случае, если функция запускает поток для экспорта анимации в фоновом режиме.В этом случае должно быть ясно, что время жизни аргумента должно превышать продолжительность вызова.Эту проблему можно решить, используя shared_ptr
- как в функции, так и вне ее - поскольку они передают, что объект является общим и будет оставаться в живых столько раз, сколько требуется значение.В противном случае вы можете фактически передать право собственности.
В последнем случае, если передача права собственности выполнена, то с исходным кодом все в порядке - подпись является явной в передаче права собственности.В противном случае вы можете задокументировать поведение, изменить необработанный указатель и сделать передачу явной, вызвав ExportAnimation( myAnimation.release() )
.
Вы добавили некоторые проблемы в качестве комментария к другому ответу:
Могу ли я увидеть, что объект больше не существует после вызова метода?
Вызывающий auto_ptr
сбрасывается в 0 в вызове, поэтому любая разыменование будет уничтоженоошибка и будет помечена в первом тесте, который вы попробуете.
Мне нужно взглянуть на файл заголовка, чтобы увидеть, что тип параметра - auto_ptr, а не обычный указатель.
Вам не нужно смотреть на заголовок ... просто попробуйте передать необработанный указатель, и компилятор скажет вам, что он требует auto_ptr<>
- Нет неявного преобразования из необработанного указателя в auto_ptr
.
Я ожидаю, что объект будет существовать, пока auto_ptr не выйдет из области видимости.
Стандарт auto_ptr
, в отличие от boost::scope_ptr
, не имеет этой семантики,Право собственности на объект может быть передано или передано другому auto_ptr
, поэтому предположение, что объект, содержащийся в auto_ptr
, живет для всей области действия auto_ptr
, само по себе является плохим.