You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用boost::posix_time::time_facet是否需手动释放内存?代码是否泄漏?

关于boost::posix_time::time_facet的内存管理与代码内存泄漏分析

核心结论

  • 把time_facet指针传给std::locale构造函数后,std::locale会接管该facet的内存所有权,后续会自动销毁它,不需要手动调用delete。
  • 你的代码不存在内存泄漏,但有潜在的双重释放风险。

详细解释

  1. std::locale的facet所有权规则
    std::locale在构造时,如果传入动态分配的facet指针(比如new创建的),会默认取得该指针的所有权。这意味着当locale对象销毁时,会自动调用delete释放facet内存——这就是为什么很多示例里只用new创建facet却不写delete,因为locale已经接手了销毁工作。

  2. 你的代码问题分析
    你用std::make_unique创建time_facet,再通过timeFacet.get()把裸指针传给std::locale,这会导致两个对象都认为自己拥有这个facet的所有权:

  • 函数结束时,std::unique_ptr会自动调用delete释放facet;
  • std::stringstream内部的locale销毁时,也会尝试delete同一个facet指针。
    这种情况会触发双重释放的未定义行为。

修正方案

方案1:直接用new创建facet(最常用写法)

nlohmann::json GetExpireDate::ExecutePayload(ClientHandle& clientHandle)
{
    boost::posix_time::ptime pt = boost::posix_time::from_time_t(m_SubFromPacket.GetEndDate());
    std::stringstream ss;
    ss.imbue(std::locale(std::locale::classic(), new boost::posix_time::time_facet("%Y-%m-%d %H:%M:%S")));
    ss << pt;
    return {{ "expire_date", ss.str()}};
}

此时locale完全接管facet内存,当ss销毁时,内部的locale会自动释放facet,既无内存泄漏也无双重释放问题。

方案2:用智能指针但主动放弃所有权

如果一定要用智能指针,调用release()方法让unique_ptr放弃所有权,把指针完全交给locale:

nlohmann::json GetExpireDate::ExecutePayload(ClientHandle& clientHandle)
{
    boost::posix_time::ptime pt = boost::posix_time::from_time_t(m_SubFromPacket.GetEndDate());
    std::stringstream ss;
    auto timeFacet = std::make_unique<boost::posix_time::time_facet>("%Y-%m-%d %H:%M:%S");
    ss.imbue(std::locale(std::locale::classic(), timeFacet.release()));
    ss << pt;
    return {{ "expire_date", ss.str()}};
}

内容的提问来源于stack exchange,提问作者user13134124

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 07:53:27