智能指针和普通指针混用导致的内存问题
在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来访问内存时,访问到的是释放后的内存。
- 点赞
- 收藏
- 关注作者
评论(0)