文档首页/ Atlas 500应用/ 应用调优/ FAQ/ 申请自动释放内存时使用智能指针,但析构器不为空,导致异常
更新时间:2021-03-18 GMT+08:00
分享

申请自动释放内存时使用智能指针,但析构器不为空,导致异常

问题现象

通过HIAI_DMalloc或HIAIMemory::HIAI_DMalloc接口申请内存(用于Host到Device或Device到Host的数据传输),将flag参数值设置为MEMORY_ATTR_AUTO_FREE(表示自动释放内存),使用智能指针存放申请的内存地址,但不定义析构器(调用默认析构器)或调用其他释放析构器(如:HIAI_DFree,会重复释放),会导致程序异常、内存泄露等情况。

解决方法

通过HIAI_DMalloc或HIAIMemory::HIAI_DMalloc接口申请内存(用于Host到Device或Device到Host的数据传输),将flag参数值设置为MEMORY_ATTR_AUTO_FREE(表示自动释放内存),使用智能指针存放申请的内存地址,由于Matrix框架自动释放内存,所以指定智能指针的析构器为空即可。

示例代码如下:

* @申请自动释放内存,如果使用智能指针,则析构器必须是空的(框架自动释放)
**/
int main()
{
    // 使用DMalloc申请自动释放
    unsigned char* inbuf = nullptr;
    uint32_t bufferLen = 1080*1920;
    // 默认是自动释放方式, flag = hiai::HIAI_MEMORY_ATTR::MEMORY_ATTR_ATUO_FREE
    HIAI_StatusT getRet = hiai::HIAIMemory::HIAI_DMalloc(bufferLen, (void*&)inbuf, 10000);
    // 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,则重复释放,也是异常
        });
    //SandData 发送数据到对端
    HIAI_StatusT sendRet = SendData(DEFAULT_PORT,"EngineTransNewT",std::static_pointer_cast<void>(engineTranData));
// todo sendRet异常判断
}

相关文档