文档首页> Atlas 300应用(型号 3000)> 应用调优> FAQ> 申请手动释放内存时使用智能指针, 但未将析构器指定为HIAI_DFree,导致异常
更新时间:2021-03-18 GMT+08:00
分享

申请手动释放内存时使用智能指针, 但未将析构器指定为HIAI_DFree,导致异常

问题现象

通过HIAI_DMalloc或HIAIMemory::HIAI_DMalloc接口申请内存(用于Host到Device或Device到Host的数据传输),将flag参数值设置为MEMORY_ATTR_MANUAL_FREE(表示手动释放内存),使用智能指针存放申请的内存地址,若指定的智能指针析构器不对,会导致程序异常、内存泄露等情况。

解决方法

通过HIAI_DMalloc或HIAIMemory::HIAI_DMalloc接口申请内存(用于Host到Device或Device到Host的数据传输),将flag参数值设置为MEMORY_ATTR_MANUAL_FREE(表示手动释放内存),使用智能指针存放申请的内存地址,需指定智能指针析构器为HIAI_DFree或HIAIMemory::HIAI_DFree。

示例代码为:

/**
* @申请手动释放内存,如果使用智能指针, 需要指定析构器为 HIAI_DFree
**/
int main()
{
    // 使用DMalloc手动释放内存
    unsigned char* inbuf = nullptr;
    uint32_t bufferLen = 1080*1920;
    HIAI_StatusT getRet = hiai::HIAIMemory::HIAI_DMalloc(bufferLen, (void*&)inbuf, 10000,hiai::HIAI_MEMORY_ATTR::MEMORY_ATTR_MANUAL_FREE);
    // todo getRet 异常判断
 
    // todo 把需要传输的数据放到 inbuf中,大小为bufferLen。
    //组装发送数据的结构体engineTranData
    EngineTransNewT   engineTranData;
    engineTranData->bufferSize = bufferLen;
    engineTranData->transBuff.reset(std::static_pointer_cast<uint8_t *> (inbuf), [](uint8_t *)(addr )
        {
            // 析构器必须调用HIAI_DFree,否则内存泄漏
            hiai::HIAIMemory::HIAI_DFree(void * addr)
        });
    //SandData 发送数据到对端
    HIAI_StatusT sendRet = SendData(DEFAULT_PORT,"EngineTransNewT",std::static_pointer_cast<void>(engineTranData));
    // todo sendRet 异常判断
}
分享:

    相关文档

    相关产品