std :: locale取得所有权

时间:2018-05-07 16:26:24

标签: c++ std

我有下一个代码:

 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的所有权?

1 个答案:

答案 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}}与它共享,如果你没有明确增加它的引用计数,它将被摧毁,因为传递一个指向它的指针不能增加引用。