Владение/удаление фасета в локали (std::locale)

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

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 не указывает владельца/delete' facet. Пробовал использовать shared_ptr-обернутые и выделенные в стеке версии facet - обе из них вызывали ошибки сегментации. Кроме того, запуск вышеупомянутой функции через valgrind не показал никаких утечек (что, вероятно, подразумевает, что локаль или поток заботятся о delete'инге), но я просто хотел прояснить, что я делаю правильную вещь здесь. Спасибо.


person decimus phostle    schedule 16.03.2011    source источник


Ответы (1)


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

person rcollyer    schedule 16.03.2011
comment
Большой! Спасибо. RTFM, да?! ;) - person decimus phostle; 17.03.2011
comment
Не расстраивайтесь, я задавал такие же вопросы! - person rcollyer; 17.03.2011
comment
Вау, я бы хотел, чтобы они пересмотрели эту часть библиотеки std с появлением C++11.. - person Zac; 02.10.2013
comment
@Zac, если вы считаете, что что-то нужно пересмотреть, примите участие в процессе. - person rcollyer; 17.10.2013