申请自动释放内存时使用智能指针,但析构器不为空,导致异常
问题现象
通过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异常判断 }