Memory leaks 托管C++;内存泄漏 我在DCOM服务器(C++ DCOM服务器)中调用一个新的RPC线程时调用内存管理漏洞,调用以下的C++方法 void CToolDataClient::SetLotManagerActive(bool bLotManagerActive) { if( m_toolDataManager != nullptr) { m_toolDataManager->LotActive = bLotManagerActive; } } 使用浮动代码获得托管C++对象指针 typedef bool (*FPTR_CREATEINTERFACE)(CToolDataInterface ** ppInterface); FPTR_CREATEINTERFACE fnptr = (FPTR_CREATEINTERFACE)GetProcAddress(hModule,(LPTSTR)"CreateInstance"); if ( NULL != fnptr ) { CICELogger::Instance()->LogMessage("CToolDataManager::CToolDataManager", Information, "Created instance of DataManagerBridge"); fnptr(&m_pToolDataInterface); }

Memory leaks 托管C++;内存泄漏 我在DCOM服务器(C++ DCOM服务器)中调用一个新的RPC线程时调用内存管理漏洞,调用以下的C++方法 void CToolDataClient::SetLotManagerActive(bool bLotManagerActive) { if( m_toolDataManager != nullptr) { m_toolDataManager->LotActive = bLotManagerActive; } } 使用浮动代码获得托管C++对象指针 typedef bool (*FPTR_CREATEINTERFACE)(CToolDataInterface ** ppInterface); FPTR_CREATEINTERFACE fnptr = (FPTR_CREATEINTERFACE)GetProcAddress(hModule,(LPTSTR)"CreateInstance"); if ( NULL != fnptr ) { CICELogger::Instance()->LogMessage("CToolDataManager::CToolDataManager", Information, "Created instance of DataManagerBridge"); fnptr(&m_pToolDataInterface); },memory-leaks,c++-cli,Memory Leaks,C++ Cli,这是我如何调用dCee服务器C++部分中的托管调用 void CToolDataManager::SetLotManagerActive(bool bLotManagerActive) { if(m_pToolDataInterface != NULL) { m_pToolDataInterface->SetLotManagerActive(bLotManagerActive); } } 下面给出的调用堆栈指示内存泄漏的位置。有没有办法解决这个内

这是我如何调用dCee服务器C++部分

中的托管调用
void CToolDataManager::SetLotManagerActive(bool bLotManagerActive)
{
    if(m_pToolDataInterface != NULL)
    {
        m_pToolDataInterface->SetLotManagerActive(bLotManagerActive);
    }
}

下面给出的调用堆栈指示内存泄漏的位置。有没有办法解决这个内存泄漏问题?请帮帮我

 ntdll!RtlDebugAllocateHeap+000000E1
 ntdll!RtlAllocateHeapSlowly+00000044
 ntdll!RtlAllocateHeap+00000E64
 mscorwks!EEHeapAlloc+00000142
 mscorwks!EEHeapAllocInProcessHeap+00000052
 **mscorwks!operator new[]+00000025
 mscorwks!SetupThread+00000238
 mscorwks!IJWNOADThunk::FindThunkTarget+00000019
 mscorwks!IJWNOADThunkJumpTargetHelper+0000000B
 mscorwks!IJWNOADThunkJumpTarget+00000048
 ICEScheduler!CToolDataManager::SetLotManagerActive+00000025** (e:\projects\ice\ice_dev\trunk\source\application source\iceschedulersystem\icescheduler\tooldatamanager.cpp, 250)
 ICEScheduler!SetLotManagerActive+00000014 (e:\projects\ice\ice_dev\trunk\source\application source\iceschedulersystem\icescheduler\schddllapi.cpp, 589)
 ICELotControl!CLotDetailsHandler::SetLotManagerStatus+0000006C (e:\projects\ice\ice_dev\source\application source\icelotsystem\icelotcontrol\lotdetailshandler.cpp, 1823)
 ICELotControl!CLotManager::StartJob+00000266 (e:\projects\ice\ice_dev\source\application source\icelotsystem\icelotcontrol\lotmanager.cpp, 205)
 RPCRT4!Invoke+00000030
 RPCRT4!NdrStubCall2+00000297
 RPCRT4!CStdStubBuffer_Invoke+0000003F
 OLEAUT32!CUnivStubWrapper::Invoke+000000C5
 ole32!SyncStubInvoke+00000033
 ole32!StubInvoke+000000A7
 ole32!CCtxComChnl::ContextInvoke+000000E3
 ole32!MTAInvoke+0000001A
 ole32!AppInvoke+0000009C
 ole32!ComInvokeWithLockAndIPID+000002E0
 ole32!ThreadInvoke+000001CD
 RPCRT4!DispatchToStubInC+00000038
 RPCRT4!RPC_INTERFACE::DispatchToStubWorker+00000113
 RPCRT4!RPC_INTERFACE::DispatchToStub+00000084
 RPCRT4!RPC_INTERFACE::DispatchToStubWithObject+000000C0
 RPCRT4!LRPC_SCALL::DealWithRequestMessage+000002CD
 RPCRT4!LRPC_ADDRESS::DealWithLRPCRequest+0000016D
 RPCRT4!LRPC_ADDRESS::ReceiveLotsaCalls+0000028F

首先,
LotActive
是成员变量/字段(纯数据)还是属性

我认为它是一个属性,在设置它之前,JIT必须编译setter的代码。在desktop.NET中,JIT编译过程生成的本机代码不是垃圾收集的,而是在AppDomain的生命周期内存在的,因此看起来可能是泄漏


能否检查此函数的每次调用是否会泄漏另一个对象,或者泄漏只发生一次?

嗨,Ben,谢谢Ben。这是一种财产。在这个位置有40起泄漏事件。谢谢是否在第一次调用属性时有40个泄漏,之后没有泄漏,或者每次调用都会导致更多泄漏?在运行应用程序的第一天,当我拍摄DCOM服务器的两个内存快照时,没有识别出所有40个泄漏。但是第二天,当我计算初始内存使用量和第二天内存使用量之间的差异时,我得到了40个泄漏。。我认为.NET在调用托管C++代码时为每个新的RPC线程分配一些内存。