に簡単なテスト解放していません: Windowsのメモリリークpthread。 `pthread_join`はメモリ
void testMemoryLeak_PthreadCreateJoin(void)
{
auto taskFunction = [](void*args) -> void*
{
return nullptr;
};
pthread_t pth;
int err = pthread_create(&pth, /*attr*/nullptr, taskFunction, /*args*/nullptr);
pthread_join(pth, nullptr);
}
void main(void)
{
_CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF);
testMemoryLeak_PthreadCreateJoin();
testMemoryLeak_PthreadCreateJoin();
testMemoryLeak_PthreadCreateJoin();
testMemoryLeak_PthreadCreateJoin();
}
は言った:
スレッドが割り当てられたリソースであり、あなたが終了する前にそれを解放しませんでした。
pthread_join
に電話する必要があります。これはまた、あなたのハッキングした誤ったスリープループの必要性を排除します。これを修正しても、valgrindはPOSIXスレッド(glibc/NPTLを使用していると思います)の実装によってスレッドリソースを解放せずに再利用するため、「リーク」が発生する可能性があります完全に。私はvalgrindがこれを回避するかどうかは分かりません。
しかし、すでにpthread_join
を使用しています。 VS2015とそのヒープアナライザを使用します。問題はpthread
私の特定の実装にある可能性がありますか?すべてのpthreadのため
Detected memory leaks!
Dumping objects ->
{104} normal block at 0x007742C0, 24 bytes long.
Data: < X > D8 00 00 00 E0 58 20 00 00 00 00 00 00 00 00 00
{101} normal block at 0x00774398, 24 bytes long.
Data: < X > D8 00 00 00 E0 58 20 00 00 00 00 00 00 00 00 00
{98} normal block at 0x00774038, 24 bytes long.
Data: < X > D8 00 00 00 E0 58 20 00 00 00 00 00 00 00 00 00
{95} normal block at 0x00774860, 24 bytes long.
Data: < X > D8 00 00 00 E0 58 20 00 00 00 00 00 00 00 00 00
Object dump complete.
24バイト:私は東勝ソング
メモリリークを引き起こすことにより、PALを使用しています。 pthread_join()
はメモリを解放する必要がありましたが、それはしませんでした。だから私は実装がバグだと思います。これを確認してください。
私は 'CrtSetDbgFlag'が解析に十分だと思います。私は 'pthreads'をデバッグするつもりはありません。それはバギーであるか、どこかで間違いを認めていることを知っていれば十分です。 – kyb
@kybもしあなたのミスを整理したいなら、 'CrtSetAllocHook'は欠陥のあるメモリブロックがあなたのスタックかpthreadsライブラリから割り当てられているかどうかを表示します。 –