FCT
载入中...
搜索中...
未找到
MemoryCheak.h
浏览该文件的文档.
1#ifndef FCT_MEMORY_CHEAK
2#define FCT_MEMORY_CHEAK
3#include <typeinfo>
4#include <mutex>
5#include <vector>
6#include <iostream>
7
8#include "../ThirdParty.h"
9#ifndef FCT_USE_ANDROID
10#define FCT_USE_MEMORY_CHECK
11#endif
12namespace FCT {
13#if defined(FCT_DEBUG) && defined(FCT_USE_MEMORY_CHECK)
14 struct _fct_object_t {
15 void* pointer;
16 std::string describe;
17 int refCounted;
18 };
19 extern std::vector<_fct_object_t*> fct_object_list;
20 extern std::string fct_object_info;
21 extern std::mutex fct_object_mutex;
22 extern int fct_object_count_delete_without_object;
23 template <typename T, typename... Args>
24 T* _fct_new(Args&&... args) {
25 T* ret = new T(std::forward<Args>(args)...);
26 _fct_object_t* object = new _fct_object_t;
27 object->pointer = ret;
28 object->refCounted = -1;
29 object->describe = typeid(ret).name();
30 fct_object_mutex.lock();
31 fct_object_list.push_back(object);
32 fct_object_mutex.unlock();
33 return ret;
34 }
35
36 template <typename T, typename AUTO>
37 T* _fct_news(AUTO size) {
38 T* ret = new T[size];
39 _fct_object_t* object = new _fct_object_t;
40 object->pointer = ret;
41 object->refCounted = -1;
42 object->describe = typeid(ret).name();
43 fct_object_mutex.lock();
44 fct_object_list.push_back(object);
45 fct_object_mutex.unlock();
46 return ret;
47 }
48 template <typename T>
49 void _fct_delete(T arg) {
50 fct_object_mutex.lock();
51 auto i = fct_object_list.begin();
52 while (i != fct_object_list.end()) {
53 if ((*i)->pointer == arg) {
54 delete (*i);
55 fct_object_list.erase(i);
56 goto FinshWhile;
57 }
58 i++;
59 }
60 if (i == fct_object_list.end()) {
61 fct_object_count_delete_without_object++;
62 }
63 FinshWhile:
64 fct_object_mutex.unlock();
65 delete arg;
66 }
67 template <typename T>
68 void _fct_deletes(T arg) {
69 auto i = fct_object_list.begin();
70 for (; i != fct_object_list.end(); i++) {
71 if ((*i)->pointer == arg) {
72 delete (*i);
73 fct_object_list.erase(i);
74 goto FinshWhiles;
75 }
76 }
77 fct_object_count_delete_without_object++;
78 FinshWhiles:
79 delete[] arg;
80 }
81 inline void _output_object_nums(std::ostream& out) {
82 out << "当前对象总计:" << fct_object_list.size() << std::endl;
83 }
84 inline void _output_object(std::ostream& out) {
85 //线程不安全
86 out << std::dec;
87 for (auto i = fct_object_list.begin(); i != fct_object_list.end(); i++) {
88 out << (*i)->describe << std::endl;
89 }
90 out << "不在object表里不delete的数量:" << fct_object_count_delete_without_object << std::endl;
91 out << "未释放对象总计:" << fct_object_list.size() << std::endl;
92 }
93
94 inline void _add_object(void* ptr, const std::string& describe)
95 {
96 _fct_object_t* object = new _fct_object_t;
97 object->pointer = ptr;
98 object->refCounted = -1;
99 object->describe = describe;
100 fct_object_mutex.lock();
101 fct_object_list.push_back(object);
102 fct_object_mutex.unlock();
103 }
104 inline bool _remove_object(void* ptr)
105 {
106 auto i = fct_object_list.begin();
107 for (; i != fct_object_list.end(); i++) {
108 if ((*i)->pointer == ptr) {
109 delete (*i);
110 fct_object_list.erase(i);
111 return true;
112 }
113 }
114 fct_object_count_delete_without_object++;
115 return false;
116 }
117
118#endif
119 template<typename T>
120 inline void AllocatorDelete(T* ptr)
121 {
122#ifdef FCT_DEBUG
123 FCT::_remove_object(ptr);
124#endif
125 operator delete[](ptr);
126 }
127 template<typename T>
128 inline T* AllocatorNew(size_t size)
129 {
130#ifdef FCT_DEBUG
131 auto ret = static_cast<T*>(operator new[](sizeof(T) * size));
132 _add_object(ret,std::string(typeid(ret).name()) + std::string(" Chunk Size: ") + std::to_string(size));
133 return ret;
134#else
135 return static_cast<T*>(operator new[](sizeof(T) * size));
136#endif
137 }
138 template<typename T>
139 inline T* New(T* ptr)
140 {
141 return new (ptr) T();
142 }
143
144 template<typename T, typename... Args>
145 inline T* New(T* ptr, Args&&... args)
146 {
147 return new (ptr) T(std::forward<Args>(args)...);
148 }
149 template<typename T>
150 inline void Destroy(T* ptr)
151 {
152 if (ptr) {
153 ptr->~T();
154 }
155 }
156}
157#if defined(FCT_DEBUG) && defined(FCT_USE_MEMORY_CHECK)
158#define FCT_NEW(type,...) FCT::_fct_new<type>(__VA_ARGS__)
159#define FCT_NEWS(type,num) FCT::_fct_news<type>(num)
160#define FCT_DELETE(args) FCT::_fct_delete<decltype(args)>(args)
161#define FCT_DELETES(args) FCT::_fct_deletes<decltype(args)>(args)
162#else
163#define FCT_NEW(type,...) new type(__VA_ARGS__)
164#define FCT_NEWS(type,num) new type[num]
165#define FCT_DELETE(args) delete args
166#define FCT_DELETES(args) delete[] args
167#endif // FCT_DEBUG
168#define FCT_SAFE_NEW(var,type,...) \
169 if (var) \
170 FCT_DELETE(var); \
171 var = FCT_NEW(type, __VA_ARGS__)
172#define FCT_SAFE_DELETE(var) \
173 if (var) {\
174 FCT_DELETE(var); \
175 var = nullptr; \
176 }
177#endif // FCT_MEMORY_CHEAK
T * New(T *ptr)
T * AllocatorNew(size_t size)
void AllocatorDelete(T *ptr)
void Destroy(T *ptr)