前回の質問に関連して、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() によって引き起こされていることを示しています。
誰でもこの問題で私を助けることができますか?