智能指针和普通指针混用导致的内存问题

举报
zxros10 发表于 2020/04/30 17:08:35 2020/04/30
【摘要】 智能指针

在C++代码中可以使用智能指针自动释放内存,为程序开发提供极大的便利。例如:

void func1() {

uint8_t* outputBuffer = nullptr;

HIAI_StatusT ret = hiai::HIAIMemory::HIAI_DVPP_DMalloc(bufferSize, (void*&)outputBuffer);

 std::shared_ptr<uint8_t> bufptr = std::shared_ptr<uint8_t>(

     reinterpret_cast<uint8_t*>(outputBuffer), hiai::HIAIMemory::HIAI_DVPP_DFree);

/*

*

*    use bufptr do something

*/

}

在func1的流程中,我们不用考虑内存outputBuffer 的释放,因为函数调用结束后该内存会自动释放。

一般来说不提倡一片内存的智能指针和普通指针混用。但是在我们的应用开发中,因为数据传递过程复杂,为了满足有些数据结构,需要用到内存的普通指针表示,例如:

void func2(DvppOut& outImage) {

uint8_t* outputBuffer = nullptr;

HIAI_StatusT ret = hiai::HIAIMemory::HIAI_DVPP_DMalloc(bufferSize, (void*&)outputBuffer);

 std::shared_ptr<uint8_t> bufptr = std::shared_ptr<uint8_t>(

     reinterpret_cast<uint8_t*>(outputBuffer), hiai::HIAIMemory::HIAI_DVPP_DFree);

/*

*

*    use bufptr do something

*/

outImage.buffer = bufptr.get();

outImage.size = bufferSize;

}

这里func2将申请的内存传递给输出参数outImage。这里因为bufptr是func2的局部变量,在 func2调用结束后,bufptr的生命周期也结束了,会自动触发hiai::HIAIMemory::HIAI_DVPP_DFree释放内存。所以在func2调用后,使用outImage.buffer来访问内存时,访问到的是释放后的内存。

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。