函数内用new创建std::locale关联boost对象时,是否需释放及如何处理?
问题解答
问题1:在函数调用内部使用new关键字时,需要释放什么对象?
- 需要释放的就是通过new关键字在堆上分配出来的对象本身。因为new会从堆中申请内存并创建对象,若没有其他机制(比如智能指针、容器接管所有权)负责内存管理,就必须手动调用
delete来释放该对象,否则会造成内存泄漏。
问题2:针对代码中std::locale构造时new的boost对象,是否需要释放?
首先看给出的代码:
static boost::posix_time::ptime getPosixTimeFromDateString( string dString ) { using namespace boost::posix_time; ptime timeDate; const std::locale loc = std::locale(std::locale::classic(), new boost::posix_time::time_input_facet("%Y-%m-%d")); std::istringstream is(dateString); is.imbue(loc); boost::posix_time::ptime t; is >> timeDate; return( timeDate ); }
- 不需要手动释放这个
boost::posix_time::time_input_facet对象。原因是std::locale的构造函数在接收指向locale facet的指针参数时,会自动接管该facet的所有权。当std::locale对象loc在函数结束时离开作用域被销毁,它会自动调用delete来释放这个facet对象,不会造成内存泄漏。 - 这个boost对象不需要在函数外部创建。它是专门为当前函数内的
std::locale实例定制的,在函数内部创建更符合局部使用的场景,也不会带来额外的管理负担。
内容的提问来源于stack exchange,提问作者tbandtg
相关产品推荐
相关产品推荐

