为什么这段代码会泄漏内存? (出论点和指针)

时间:2015-04-11 01:03:50

标签: c++ pointers memory-leaks

我是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”。

1 个答案:

答案 0 :(得分:2)

此代码违反了COM的引用计数机制,只有一个对象引用时才能正常工作:

delete pReport  

通常,您应该调用Release方法或使用CComPtr智能指针:

CComPtr<ISensorDataReport> pReport;
HRESULT hr = pSensor->GetData(&pReport);