与我之前的问题相关,我假设内存泄漏发生在 std::string 中,但深入研究后,我得到了一些奇怪的结果。让我们开始:
考虑到我们有一个全球
static volatile std::wostringstream *Log = nullptr;
在 WriteToLog() 函数中,我们有以下代码:
std::wostringstream* new_log = new std::wostringstream(std::ios::in | std::ios::out);
new_log->imbue(CConsumer::GetUtf8Locale());
std::wostringstream* old_log = (std::wostringstream*)Log;
while((std::wostringstream *)::InterlockedCompareExchangePointer((PVOID volatile *)&Log, new_log, (PVOID)old_log) != new_log)
{
::SleepEx(10, FALSE);
}
std::string logtext(Hooker::Utf16ToUtf8(old_log->str()));
它利用专有的:
static std::locale FORCEINLINE GetUtf8Locale()
{
static std::unique_ptr<std::codecvt_utf8_utf16<wchar_t>> code_cvt(new std::codecvt_utf8_utf16<wchar_t>(std::codecvt_mode::generate_header | std::codecvt_mode::little_endian));
return std::locale(std::locale(), code_cvt.get());
}
由于日志事件偶尔发生,它会产生巨大的内存泄漏(从最初的 5MB/500 个句柄在几分钟内跃升至 200MB/300,000 个句柄)。
以前,我假设它是与 std::string 相关的泄漏,但是,使用 Visual Studio Profiler,它表明所有泄漏都是由 GetUtf8Locale() 引起的。
有人可以帮我解决这个问题吗?