-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathMemoryPool.cpp
115 lines (96 loc) · 1.99 KB
/
MemoryPool.cpp
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
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
/*
* File: MemoryPool.cpp
* Author: try
*
* Created on 2011年7月8日, 下午11:48
*/
#include "MemoryPool.h"
MemoryPool MemoryPool::instance;
MemoryPool::MemoryPool(){
}
MemoryPool::~MemoryPool() {
}
/**
* 请求内存
*/
void* MemoryPool::malloc(size_t size){
return ::malloc(size);
}
/**
* 重新分配内存
*/
void* MemoryPool::realloc(void* ptr, size_t size){
return ::realloc(ptr, size);
}
/**
* 释放内存
*/
void MemoryPool::free(void* ptr){
if(!ptr){
LOG_ERROR("is NULL")
return;
}
::free(ptr);
}
MemoryPool::Group::Group(){
}
MemoryPool::Group::~Group(){
freeAll();
}
/**
* 申请内存
*/
void* MemoryPool::Group::malloc(size_t size){
void* ptr = MemoryPool::instance.malloc(size);
memoryPtrs.insert(ptr);
return ptr;
}
/**
* 释放内存
*/
void MemoryPool::Group::free(void* ptr){
if(!ptr){
LOG_ERROR("Group, ptr is NULL")
return;
}
MemoryPtrs::iterator it = memoryPtrs.find(ptr);
if(it != memoryPtrs.end()){
memoryPtrs.erase(it);
MemoryPool::instance.free(ptr);
}else{
LOG_ERROR("Group, the ptr not in Group")
}
}
/**
* 复制内存
*
* newlen 为新内存长度
* copylen 为从src中复制的长度, copylen必须小于等于newlen
*
* @return 返回新的内存地址
*/
void* MemoryPool::Group::copy(const void* src, size_t newSize, size_t copySize){
void* ptr = MemoryPool::instance.malloc(newSize);
memcpy(ptr, src, copySize);
memoryPtrs.insert(ptr);
return ptr;
}
/**
* 复制内存
*/
void* MemoryPool::Group::copy(const char* src, size_t size){
void* ptr = MemoryPool::instance.malloc(size);
memcpy(ptr, src, size);
memoryPtrs.insert(ptr);
return ptr;
}
/**
* 释放此组中所有内存
*/
void MemoryPool::Group::freeAll(){
MemoryPtrs::iterator it = memoryPtrs.begin();
for(; it != memoryPtrs.end(); it++){
MemoryPool::instance.free(*it);
}
memoryPtrs.clear();
}