使用OH_NativeWindow_CreateNativeBufferFromNativeBuffer()或OH_NativeWindow_CreateNativeBufferFromSurfaceBuffer()创建的原生窗口缓冲区,使用完毕后,需及时调用OH_NativeWindow_DestroyNativeWindowBuffer()进行释放,避免缓冲区资源无法回收,造成内存泄漏。
// rules.json
{
"rules": {
"cpp": {
"ResourceLeak": [
{
"ruleId": "NativeWindowBuffer API Not Paired",
"severity": "error",
"skip": false
}
]
}
}
} // 正例代码
#include "native_window/external_window.h"
void ProcessBufferFromSurfaceWithDestroy(void *surfaceBuffer)
{
OHNativeWindowBuffer *buffer = OH_NativeWindow_CreateNativeWindowBufferFromSurfaceBuffer(surfaceBuffer);
if (buffer == nullptr) {
return;
}
// 使用 buffer 进行处理...
// 正确销毁缓冲区
OH_NativeWindow_DestroyNativeWindowBuffer(buffer);
}
void ProcessBufferFromNativeWithDestroy2(OH_NativeBuffer* nativeBuffer)
{
OHNativeWindowBuffer *buffer = OH_NativeWindow_CreateNativeWindowBufferFromNativeBuffer(nativeBuffer);
if (buffer == nullptr) {
return;
}
// 使用 buffer 进行处理...
// 正确销毁缓冲区
OH_NativeWindow_DestroyNativeWindowBuffer(buffer);
} // 反例代码
#include "native_window/external_window.h"
void ProcessBufferWithoutDestroy(void *surfaceBuffer)
{
// 从 Surface Buffer 创建
OHNativeWindowBuffer *buffer = OH_NativeWindow_CreateNativeWindowBufferFromSurfaceBuffer(surfaceBuffer);
if (buffer == nullptr) {
return;
}
// 使用 buffer...
// 未释放 - 内存泄漏!
} Code Scanner代码检查规则的配置指导请参考1.6.3 代码检查工具(codescanner)