Да, второй случай безопасен.
Но вызывающей стороне потребуется delete
возвращенный указатель. Вы можете изменить это на использование boost::shared_ptr
, и оно будет уничтожено, когда оно больше не используется:
boost::shared_ptr<person> NewPerson()
{
boost::shared_ptr<person> pp = boost::make_shared<person>();
return pp;
}
Если C ++ 11, то вы можете использовать std::shared_ptr
или std::unique_ptr
.