智能指针和普通指针混用导致的内存问题
【摘要】 智能指针
在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)