使用OH_NativeWindow_ReadFromParcel从Parcel()或OH_NativeWindow_CreateNativeWindowFromSurfaceId从Surface()读取原生窗口后,需及时调用OH_NativeWindow_DestroyNativeWindow()进行释放,避免窗口对象无法回收,造成内存泄漏。
// rules.json
{
"rules": {
"cpp": {
"ResourceLeak": [
{
"ruleId": "NativeWindow API Not Paired",
"severity": "error",
"skip": false
}
]
}
}
} // 正例代码
#include "native_window/external_window.h"
void ReadWindowFromParcelWithDestroy(OHIPCParcel *parcel)
{
// 从 Parcel 读取窗口
OHNativeWindow *window;
int32_t state = OH_NativeWindow_ReadFromParcel(parcel, &window);
if (state != 0 || window == nullptr) {
return;
}
// 使用 window...
// 正确销毁窗口对象
OH_NativeWindow_DestroyNativeWindow(window);
}
void ReadWindowFromSurfaceIdWithDestroy(uint64_t surfaceId)
{
// 从 Surface 读取窗口
OHNativeWindow *window;
int32_t state = OH_NativeWindow_CreateNativeWindowFromSurfaceId(surfaceId, &window);
if (state != 0 || window == nullptr) {
return;
}
// 使用 window...
// 正确销毁窗口对象
OH_NativeWindow_DestroyNativeWindow(window);
} // 反例代码
#include "native_window/external_window.h"
void ReadWindowFromParcelWithoutDestroy(OHIPCParcel *parcel)
{
// 从 Parcel 读取窗口
OHNativeWindow *window;
int32_t state = OH_NativeWindow_ReadFromParcel(parcel, &window);
if (state != 0 || window == nullptr) {
return;
}
// 使用 window...
// 未释放 - 内存泄漏!
} Code Scanner代码检查规则的配置指导请参考1.6.3 代码检查工具(codescanner)