-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathcv_memory_pool.cpp
More file actions
57 lines (49 loc) · 1.33 KB
/
cv_memory_pool.cpp
File metadata and controls
57 lines (49 loc) · 1.33 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
//
// Created by wnc on 2025/9/15.
//
#include "cv_memory_pool.h"
#include "memory_pool_ctr.h"
#include <cstdlib>
#include <iostream>
// 配置常见的子池(可根据实际调整)
static MemoryPoolCtr g_poolCtr({
{16, 1024},
{32, 1024},
{64, 1024},
{128, 512},
{256, 512},
{512, 256},
{1024, 128},
{4096, 64},
{16384, 16},
});
// cvAlloc:优先使用内存池,若找不到合适池则回退到 malloc
void* cvAlloc(size_t size) {
try {
MemoryPool& pool = g_poolCtr.getPoolForSize(size);
return pool.allocate(__FILE__, __LINE__, __func__);
} catch (...) {
// 超过最大池或异常 -> 回退 malloc
return std::malloc(size);
}
}
// cvFree:先查找哪个子池管理该 ptr,若找到则交由子池回收,否则 free
void cvFree(void* ptr) {
if (!ptr) return;
MemoryPool* pool = g_poolCtr.findPoolForPtr(ptr);
if (pool) {
pool->deallocate(ptr);
} else {
std::free(ptr);
}
}
// 在程序退出时打印一次泄漏报告(可选)
static void AtExitReport() {
std::cout << "===== MemoryPool Leaks Report (atexit) =====" << std::endl;
g_poolCtr.reportLeaks();
}
static int register_reporter = (std::atexit(AtExitReport), 0);
// 提供手动触发
void cvReportLeaks() {
g_poolCtr.reportLeaks();
}