如何正确使用boost::locale?修复代码内存泄漏及逻辑问题
修正boost::locale使用及内存泄漏问题
问题分析
你的代码存在两个核心问题:
- 内存泄漏:手动
new创建的boost::gregorian::date_facet未被正确管理,结合boost::locale的locale使用时,临时locale对象的生命周期会导致facet无法被及时释放; - 逻辑错误:循环中未清空
std::ostringstream,每次调用os.str()都会返回之前所有输出内容的累加结果,不符合预期。
修正后的代码
#include <boost/locale.hpp> #include <boost/date_time/gregorian/gregorian.hpp> #include <sstream> #include <vector> #include <string> std::vector<std::string> getResult() { boost::locale::generator gen; // 直接存储locale值,避免引用绑定临时对象的生命周期问题 std::locale loc = gen.generate("en_US.UTF-8"); std::locale::global(loc); // 构造持久化locale对象,让其接管date_facet的所有权 boost::gregorian::date_facet* facet = new boost::gregorian::date_facet("%b"); std::locale date_loc(loc, facet); std::ostringstream os; os.imbue(date_loc); std::vector<bool> vec{1, 0, 1}; // 测试数据 std::vector<std::string> vresult; for(const auto& t : vec) { if(!t) continue; boost::gregorian::date d{1900, 10, 1}; // 每次循环清空流内容并重置状态 os.str(""); os.clear(); os << d; vresult.emplace_back(os.str()); } return vresult; }
关键修正说明
- 内存泄漏修复:将包含date_facet的locale对象持久化(
date_loc),确保facet的所有权被locale正确接管,当date_loc销毁时会自动释放facet,彻底避免手动内存管理的风险; - 逻辑错误修复:每次循环调用
os.str("")清空流内容,os.clear()重置流的状态位,确保每次输出都是独立的日期字符串; - locale优化:直接存储
gen.generate()返回的locale值而非引用,规避临时对象生命周期引发的潜在问题; - 规范修正:将非标准
BOOL改为标准bool,locale名称调整为符合规范的en_US.UTF-8。
更简洁的boost::locale原生用法
如果直接使用boost::locale的日期格式化功能,代码会更简洁且兼容性更好:
#include <boost/locale.hpp> #include <boost/date_time/gregorian/gregorian.hpp> #include <sstream> #include <vector> #include <string> std::vector<std::string> getResult() { boost::locale::generator gen; std::locale loc = gen.generate("en_US.UTF-8"); std::locale::global(loc); std::ostringstream os; os.imbue(loc); std::vector<bool> vec{1, 0, 1}; std::vector<std::string> vresult; for(const auto& t : vec) { if(!t) continue; boost::gregorian::date d{1900, 10, 1}; os.str(""); os.clear(); // 使用boost::locale内置的短日期格式(输出"Oct") os << boost::locale::as::date_short << d; // 也可自定义格式:os << boost::locale::format("%b") % d; vresult.emplace_back(os.str()); } return vresult; }
内容的提问来源于stack exchange,提问作者nguyenmanh02123221
相关产品推荐
相关产品推荐

