これは安価なハックですが、私が取り組んでいるCライブラリの割り当て方法を変更しようとしています。なんらかの理由でGlobalLockを使用していました。これはおそらく複数のDLLであったからです。私はALLOCにそれを変更しました:Cライブラリの更新中にヒープの破損が発生する
HANDLE BmiDibAlloc(size_t uBytes)
{
HANDLE alloc = malloc(uBytes + sizeof (size_t));
if (alloc != NULL)
{
memcpy_s(alloc, sizeof (alloc), &uBytes, sizeof (size_t));
}
return BmiDibAttach(alloc); //just tracks the number of memory allocs for logging
}
BOOL BmiDibFree(HANDLE hdib)
{
if (!hdib) {
return TRUE;
}
free(hdib);
// Forget this handle:
return BmiDibDetach(hdib);
}
割り当てられた後にビットマップが細かい書くとき、私は...最初のsizeof(size_tの)バイトの割り当てのサイズに私はタックもう
をGlobalSizeを使用することはできませんので、最初の方法で - しかし、私がフリーになると、ヒープの破損がスローされます。これらの呼び出しの間のどこかにある可能性があります。
コードは正常に見えますが、おそらく問題はコードの残りの部分です。私が見ている唯一の間違いは 'sizeof(alloc)'が間違っていることです、 'sizeof(size_t)'でなければなりません(ただし、すべてのWindowsプラットフォーム 'sizeof(HANDLE)' == 'sizeof == 'sizeof(size_t)')。 –
@MatteoItaliaなぜあなたは私がこれをする必要があるのか分かりますか?ライブラリの特定の部分は、以前は割り当てにGlobalSize()を使用していました。多分私はそれがvoid *ではなかったのでsizeof(* alloc)で置き換えることができました。 –
サイズを前に付けると、このメモリを使用するすべてのものがそれに混乱していないことを確認しますか?たとえば、メモリブロックが実際にuBytes + sizeof(size_t)であることを考慮してください。サイズを変更しますか? – nos