我正在使用原生CLR託管幾個星期了。一開始它工作得很好。但後來我發現應用程序中的某些內容會導致堆損壞。我發現這是CLR初創公司造成的。 (請參見下面的代碼的短版。)CLR4主機接口導致堆損壞?
#pragma comment(lib, "mscoree.lib")
#include <mscoree.h>
#include <metahost.h>
#include <comdef.h>
#import "mscorlib.tlb" raw_interfaces_only \
high_property_prefixes("_get","_put","_putref") \
rename("ReportEvent", "InteropServices_ReportEvent")
using namespace mscorlib;
int _tmain(int argc, _TCHAR* argv[])
{
HRESULT hr; // In fullversion used for error detection - but here unused.
PCWSTR pszVersion = L"v4.0.30319";
ICLRMetaHost* lpMetaHost = NULL;
ICLRRuntimeInfo* lpRuntimeInfo = NULL;
ICorRuntimeHost* lpRuntimeHost = NULL;
_AppDomainPtr spAppDomain = NULL;
BOOL bLoadable = false;
IUnknownPtr spAppDomainThunk = NULL;
CLRCreateInstance(CLSID_CLRMetaHost, IID_ICLRMetaHost, (LPVOID *)&lpMetaHost);
// After this line i can "late detect" 6 array bound heap corruptions in process memory.
lpMetaHost->GetRuntime(pszVersion, IID_ICLRRuntimeInfo, (LPVOID *)&lpRuntimeInfo);
lpRuntimeInfo->IsLoadable(&bLoadable);
lpRuntimeInfo->GetInterface(CLSID_CorRuntimeHost, IID_PPV_ARGS(&lpRuntimeHost));
lpRuntimeHost->Start();
lpRuntimeHost->GetDefaultDomain(&spAppDomainThunk);
spAppDomainThunk->QueryInterface(IID_PPV_ARGS(&spAppDomain));
spAppDomainThunk->Release();
// Now I can "late detect" up to 9 array bound heap corruptions in process memory.
return 0;
}
如何避免這種情況的任何想法?目前在某些情況下,它仍然有效,但隨着我的應用程序越來越大,出現錯誤的機率呈指數增長。
你不檢查失敗,你不初始化你的指針爲空 - 我認爲完整版本的代碼檢查錯誤? – Justin
是的,因此我使用HRESULT,這是在我的摘錄中定義但未使用的。沒有錯誤我只想盡量縮短我的問題。我會注意到在我的問題thx。 –
似乎這裏的代碼沒有錯。如果在spAppDomainThunk-> Release()之後立即返回,您會收到淨化錯誤嗎? – elevener