我是C ++的新手。我写这个方法来轮询加速度计。它被反复调用,并泄漏内存。
AccelSample SensorObj::GetReport() {
ISensorDataReport* pReport;
HRESULT hr = pSensor->GetData(&pReport);
// theoretically, i would fill this struct with the values from pReport, but this is just here for testing.
AccelSample sample;
sample.x = 0;
sample.y = 0;
sample.z = 0;
sample.timestamp = 0;
return sample;
}
行
HRESULT hr = pSensor->GetData(&pReport);
似乎是泄漏的根源。如果我发表评论,那就没有泄漏。 GetData的定义是
virtual HRESULT STDMETHODCALLTYPE GetData(__RPC__deref_out_opt ISensorDataReport **ppDataReport) = 0;
此API的文档显示GetData以相同的方式调用。 https://msdn.microsoft.com/en-us/library/windows/desktop/dd318962%28v=vs.85%29.aspx
如果我理解正确,GetData采用out参数,该参数是指针的指针。通过传递& pReport,我传递指针pReport的“地址”。是对的吗?这不应该没问题吗?
编辑:我应该提到我试过“删除pReport”。我得到一个错误,上面写着“Debug assertion failed。_BLOCK_TYPE_IS_VALID(pHead-> nBlockUse”。
答案 0 :(得分:2)
此代码违反了COM的引用计数机制,只有一个对象引用时才能正常工作:
delete pReport
通常,您应该调用Release方法或使用CComPtr智能指针:
CComPtr<ISensorDataReport> pReport;
HRESULT hr = pSensor->GetData(&pReport);