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(const Args&... arg) {
25 T* ret = new T(arg...);
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 for (auto i = fct_object_list.begin(); i != fct_object_list.end(); i++) {
87 out << (*i)->describe << std::endl;
88 }
89 out << "不在object表里不delete的数量:" << fct_object_count_delete_without_object << std::endl;
90 out << "未释放对象总计:" << fct_object_list.size() << std::endl;
91 }
92
93 inline void _add_object(void* ptr, const std::string& describe)
94 {
95 _fct_object_t* object = new _fct_object_t;
96 object->pointer = ptr;
97 object->refCounted = -1;
98 object->describe = describe;
99 fct_object_mutex.lock();
100 fct_object_list.push_back(object);
101 fct_object_mutex.unlock();
102 }
103 inline bool _remove_object(void* ptr)
104 {
105 auto i = fct_object_list.begin();
106 for (; i != fct_object_list.end(); i++) {
107 if ((*i)->pointer == ptr) {
108 delete (*i);
109 fct_object_list.erase(i);
110 return true;
111 }
112 }
113 fct_object_count_delete_without_object++;
114 return false;
115 }
116
117#endif
118 template<typename T>
119 inline void AllocatorDelete(T* ptr)
120 {
121#ifdef FCT_DEBUG
122 FCT::_remove_object(ptr);
123#endif
124 operator delete[](ptr);
125 }
126 template<typename T>
127 inline T* AllocatorNew(size_t size)
128 {
129#ifdef FCT_DEBUG
130 auto ret = static_cast<T*>(operator new[](sizeof(T) * size));
131 _add_object(ret,std::string(typeid(ret).name()) + std::string(" Chunk Size: ") + std::to_string(size));
132 return ret;
133#else
134 return static_cast<T*>(operator new[](sizeof(T) * size));
135#endif
136 }
137 template<typename T>
138 inline T* New(T* ptr)
139 {
140 return new (ptr) T();
141 }
142
143 template<typename T, typename... Args>
144 inline T* New(T* ptr, Args&&... args)
145 {
146 return new (ptr) T(std::forward<Args>(args)...);
147 }
148 template<typename T>
149 inline void Destroy(T* ptr)
150 {
151 if (ptr) {
152 ptr->~T();
153 }
154 }
155}
156#if defined(FCT_DEBUG) && defined(FCT_USE_MEMORY_CHECK)
157#define FCT_NEW(type,...) FCT::_fct_new<type>(__VA_ARGS__)
158#define FCT_NEWS(type,num) FCT::_fct_news<type>(num)
159#define FCT_DELETE(args) FCT::_fct_delete<decltype(args)>(args)
160#define FCT_DELETES(args) FCT::_fct_deletes<decltype(args)>(args)
161#else
162#define FCT_NEW(type,...) new type(__VA_ARGS__)
163#define FCT_NEWS(type,num) new type[num]
164#define FCT_DELETE(args) delete args
165#define FCT_DELETES(args) delete[] args
166#endif // FCT_DEBUG
167#define FCT_SAFE_NEW(var,type,...) \
168 if (var) \
169 FCT_DELETE(var); \
170 var = FCT_NEW(type, __VA_ARGS__)
171#define FCT_SAFE_DELETE(var) \
172 if (var) {\
173 FCT_DELETE(var); \
174 var = nullptr; \
175 }
176#endif // FCT_MEMORY_CHEAK
T * New(T *ptr)
T * AllocatorNew(size_t size)
void AllocatorDelete(T *ptr)
void Destroy(T *ptr)