根据这里关于如何用逗号格式化数字的问题的答案,我使用以下代码:
#include <locale>
#include <stringstream>
namespace
{
class comma_numpunct : public std::numpunct<char>
{
protected:
virtual char do_thousands_sep() const
{
return ',';
}
virtual std::string do_grouping() const
{
return " 3";
}
};
}
/* Convert number to string using a comma as the thousands separator. */
string thousands(const int x) {
/* custom locale to ensure thousands separator is comma */
comma_numpunct* comma_numpunct_ptr = new comma_numpunct();
std::locale comma_locale(std::locale(), comma_numpunct_ptr);
stringstream ss;
ss.imbue(comma_locale); // apply locale to stringstream
ss << x;
/* garbage collection */
delete comma_numpunct_ptr;
return ss.str();
}
GDB给出以下回溯:
Program received signal SIGSEGV, Segmentation fault.
0x0000000000000021 in ?? ()
(gdb) bt
#0 0x0000000000000021 in ?? ()
#1 0x00007ffff7701535 in std::locale::_Impl::~_Impl() () from /usr/lib/x86_64-linux-gnu/libstdc++.so.6
#2 0x00007ffff770166d in std::locale::~locale() () from /usr/lib/x86_64-linux-gnu/libstdc++.so.6
#3 0x000000000044b93e in thousands (x=358799) at ../globals_utilities.cpp:104
#4 0x000000000045650d in main (argc=1, argv=0x7fffffffdf58) at ../main.cpp:67
所以,问题是(我相信)我试图释放new
'd内存。但我不知道怎么解决这个问题。(我不能使用std::unique_ptr
,因为我不总是用c++ 11支持编译。)
如何修复段错误而不泄漏内存?
您的问题是语言环境方面(标点符号)。如果您通过构造函数将其传递给区域设置,并且facet的引用为零,则区域设置将删除该facet。
你可以这样做:
comma_numpunct(size_t refs = 0)
: numpunct(refs)
{}
和
comma_numpunct* comma_numpunct_ptr = new comma_numpunct(1);
或者最好省略:
// double delete
// delete comma_numpunct_ptr;
可以省略facet的分配:
string thousands(const int x) {
comma_numpunct numpunct(1);
std::locale comma_locale(std::locale(), &numpunct);
std::stringstream ss;
ss.imbue(comma_locale);
ss << x;
return ss.str();
}
来自22.3.1.1.2 Class locale::facet
构造函数的refs参数用于生命周期管理。
—对于ref == 0,执行delete操作Static_cast (f)(其中f是指向facet的指针)当最后一个包含facet的locale对象被销毁时;为Refs == 1,实现永远不会破坏facet。