使用OH_NativeWindow_NativeWindowRequestBuffer()请求缓冲区后,需使用OH_NativeWindow_NativeWindowFlushBuffer()提交缓冲区,以完成缓冲区的生命周期管理,避免缓冲区无法回收,造成内存泄漏。
// rules.json
{
"rules": {
"cpp": {
"ResourceLeak": [
{
"ruleId": "NativeWindowRequestBuffer API Not Paired",
"severity": "error",
"skip": false
}
]
}
}
} // 正例代码
#include "native_window/external_window.h"
void RequestAndFlushBuffer(OHNativeWindow *window)
{
OHNativeWindowBuffer *buffer = nullptr;
int fenceFd = -1;
int ret = OH_NativeWindow_NativeWindowRequestBuffer(window, &buffer, &fenceFd);
if (ret != 0 || buffer == nullptr) {
return;
}
// 填充缓冲区...
// 正确提交缓冲区
Region region = {nullptr, 0}; // 整个缓冲区已更新
OH_NativeWindow_NativeWindowFlushBuffer(window, buffer, fenceFd, region);
} // 反例代码
#include "native_window/external_window.h"
void RequestBufferWithoutFlush(OHNativeWindow *window)
{
OHNativeWindowBuffer *buffer = nullptr;
int fenceFd = -1;
// 请求缓冲区
int ret = OH_NativeWindow_NativeWindowRequestBuffer(window, &buffer, &fenceFd);
if (ret != 0 || buffer == nullptr) {
return;
}
// 填充缓冲区...
// 忘记 Flush, 未刷新 - 内存泄漏!
} Code Scanner代码检查规则的配置指导请参考1.6.3 代码检查工具(codescanner)