申请手动释放内存时使用智能指针, 但未将析构器指定为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 异常判断 }