1
基於答案here對如何號碼用逗號格式化問題stringstream的時候,我使用下面的代碼:段錯誤imbueing自定義區域
#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 "\03";
}
};
}
/* 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
的內存。但我不知道如何解決這個問題。 (我不能使用std::unique_ptr
,因爲我並不總是使用C++ 11支持進行編譯。)
如何在不泄漏內存的情況下修復段錯誤?
你不應該手動釋放內存。 'std :: locale'的析構函數會爲你做。 – 0x499602D2
爲什麼不只是使用靜態對象?那麼不需要刪除任何東西。 – Deduplicator
@ user4815162342仍然是sigfaults。 – synaptik