我有下一个代码:
boost::posix_time::time_facet facet("%Y-%m-%dT%H:%M:%f");
std::stringstream ss;
ss.imbue(std::locale(ss.getloc(), &facet));
当我运行这段代码时,看起来编译器尝试在facet
析构函数调用期间释放ss
(debuger说它)。
当我运行此代码时:
std::stringstream ss;
ss.imbue(std::locale(ss.getloc(), new boost::posix_time::time_facet("%Y-%m-%dT%H:%M:%f")));
好的。
所以,我想知道是否存在关于此行为的任何文档或local
取得所有权的原因。我试图找出解释,但文档中没有任何内容。
std::locale()
是否取得time_facet的所有权?
答案 0 :(得分:2)
http://en.cppreference.com/w/cpp/locale/locale/locale
template< class Facet >
locale( const locale& other, Facet* f ); (7)
通常使用第二个参数f调用重载7,该参数直接从new-expression获得:locale负责从其自己的析构函数中调用匹配的删除。
在http://eel.is/c++draft/locale.facet#3中还有另一个暗示:
构造函数的refs参数用于生命周期管理。 对于refs == 0,当包含facet的最后一个locale对象被销毁时,实现执行delete static_cast(f)(其中f是指向facet的指针);对于refs == 1,实现永远不会破坏方面。
因此,facet
(和派生类)中存在内部引用计数机制。这或多或少意味着传递给facet
的{{1}}与它共享,如果你没有明确增加它的引用计数,它将被摧毁,因为传递一个指向它的指针不能增加引用。