Владение / удаление фасета в локали (std :: locale) - PullRequest
16 голосов
/ 16 марта 2011

Я написал следующую функцию для получения строки даты / времени, используя boost.date_time .

namespace bpt = boost::posix_time;

string
get_date_time_string(bpt::ptime time)
{
  bpt::time_facet * facet(new bpt::time_facet);
  facet->format("%Y%m%d%H%M%S");

  stringstream return_value;
  return_value.imbue(std::locale(std::locale::classic(), facet));
  return_value << time;

  return return_value.str();
}

У меня был быстрый вопрос о владении / delete 'facet объектом. std :: locale's constructor не является явным в отношении владения / delete 'facet.Пробовал использовать shared_ptr -wrapped и выделять стеки версии facet - обе из которых вызывали ошибки сегмента.Кроме того, выполнение вышеупомянутой функции через valgrind не показало каких-либо утечек (что, вероятно, подразумевает, что локаль или поток позаботились о delete '), но я просто хотел пояснить, что здесь я поступаю правильно.Спасибо.

1 Ответ

14 голосов
/ 16 марта 2011

Согласно Stroustrup , аргумент 0, переданный конструктору, сообщает facet, что locale будет обрабатывать разрушение, и оба конструктора bpt::time_facet по умолчанию равны 0, когда это не такв комплект поставки.Ненулевое значение, однако, подразумевает, что программист должен явно обработать уничтожение facet.

...