1.  问题现象

hisysevent -l 指令每次执行都会导致 hiview进程 增加700多kb内存

手动杀掉 hiview进程 才能释放清空内存

2.  hisysevent -l hiview 交互流程图

 3.   内存泄露原因分析 
    new分配的堆内存块,没有进行主动释放,导致产生内存泄露
 

 4.  实例分析及原因解析
 

路径:base/hiviewdfx/hiview/base/event_store/utility/reader/event_entry_creator.cpp

std::shared_ptr<EventRaw::DecodedEvent> EventEntryCreator::BuildDecodedEvent(uint8_t* content, uint32_t contentSize)

{

uint8_t* rawEvent = BuildRawEvent(content, contentSize);

if (rawEvent == nullptr)

{ ​  return nullptr;}

  return std::make_shared<EventRaw::DecodedEvent>(rawEvent);

}

 

   uint8_t* EventEntryCreator::BuildRawEvent(uint8_t* content, uint32_t contentSize)

{

     uint32_t eventSize = contentSize - DOC_EVENT_HEADER_SIZE + HISYSEVENT_HEADER_SIZE;

     uint8_t* event = new(std::nothrow) uint8_t[eventSize];

     if (event == nullptr) {

       HIVIEW_LOGE("failed to new memory for raw event, size=%{public}u", eventSize); return nullptr;

     } ...

     return event;

}

BuildRawEvent 函数中 通过new的方式 动态申请了内存 作为返回值 uint8_t* 对象, 给 BuildDecodedEvent 进行调用  但是最终没有进行 delete 释放导致内存泄露  使用完后手调用 delele 释放内存 或者 采用智能指针的方式 auto *

Logo

社区规范:仅讨论OpenHarmony相关问题。

更多推荐