昇腾学院 | 案例分享 HIAI_DMalloc接口出现double free问题
问题现象描述
问题现象:业务调试过程中,程序出现double free异常,日志报错如下:
关键过程、根本原因分析
关键过程:
1、 使用HIAI_DMalloc接口为host侧的输入文件申请内存,如下所示:
2、 通过SendData函数发送数据结构体到device侧。
3、 由于传入的buffer是智能指针,会自动释放一次内存。
4、 HIAI_DMalloc申请的内存通过SendData发送,Matrix框架内部又会自动释放一次。
5、 HIAI_DMalloc申请的内存被重复释放两次,通过修改智能指针的默认释放内存方式,保证该内存只被释放一次。
根本原因分析:
1、序列化结构体中使用智能指针存储数据,同时通过SendData函数跨侧传输该数据,整个过程中该内存会被释放两次。
结论、解决方案及效果
结论:通过修改智能指针的默认释放内存方式,保证内存只被释放一次。
经验总结、预防措施和规范建议
通过HIAI_DMalloc接口申请内存,关于内存管理,请注意以下要点:
1、申请自动释放内存,用于Host到Device或Device到Host的数据传输时,如果是智能指针,由于Matrix框架自动释放内存,所以智能指针指定的析构器必须是空的;如果非智能指针,则Matrix框架自动释放。
2、申请手动释放内存,用于Host到Device或Device到Host的数据传输时,如果是智能指针,则需要指定析构器为HIAIMemory::HIAI_DFree;如果非智能指针,则数据发送完成后需要调用HIAIMemory::HIAI_DFree释放内存。
3、申请自动释放内存,对于该内存中的数据,不允许多次调用SendData接口发送数据。
4、申请手动释放内存时,如果用于Host到Device或Device到Host的数据传输时,在内存释放前,不可复用内存中的数据;如果用于Host到Host或Device到Device的数据传输时,在内存释放前,可以复用内存中的数据。
5、申请手动释放内存时,如果调用SendData接口异步传输数据,发送数据后,不允许修改内存中的数据。
- 点赞
- 收藏
- 关注作者
评论(0)