1#ifndef FCT_MEMORY_CHEAK
2#define FCT_MEMORY_CHEAK
10#define FCT_USE_MEMORY_CHECK
13#if defined(FCT_DEBUG) && defined(FCT_USE_MEMORY_CHECK)
14 struct _fct_object_t {
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();
36 template <
typename T,
typename AUTO>
37 T* _fct_news(AUTO 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();
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) {
55 fct_object_list.erase(i);
60 if (i == fct_object_list.end()) {
61 fct_object_count_delete_without_object++;
64 fct_object_mutex.unlock();
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) {
73 fct_object_list.erase(i);
77 fct_object_count_delete_without_object++;
81 inline void _output_object_nums(std::ostream& out) {
82 out <<
"当前对象总计:" << fct_object_list.size() << std::endl;
84 inline void _output_object(std::ostream& out) {
87 for (
auto i = fct_object_list.begin(); i != fct_object_list.end(); i++) {
88 out << (*i)->describe << std::endl;
90 out <<
"不在object表里不delete的数量:" << fct_object_count_delete_without_object << std::endl;
91 out <<
"未释放对象总计:" << fct_object_list.size() << std::endl;
94 inline void _add_object(
void* ptr,
const std::string& describe)
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();
104 inline bool _remove_object(
void* ptr)
106 auto i = fct_object_list.begin();
107 for (; i != fct_object_list.end(); i++) {
108 if ((*i)->pointer == ptr) {
110 fct_object_list.erase(i);
114 fct_object_count_delete_without_object++;
123 FCT::_remove_object(ptr);
125 operator delete[](ptr);
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));
135 return static_cast<T*
>(
operator new[](
sizeof(T) * size));
141 return new (ptr) T();
144 template<
typename T,
typename... Args>
145 inline T*
New(T* ptr, Args&&... args)
147 return new (ptr) T(std::forward<Args>(args)...);
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)
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
168#define FCT_SAFE_NEW(var,type,...) \
171 var = FCT_NEW(type, __VA_ARGS__)
172#define FCT_SAFE_DELETE(var) \
T * AllocatorNew(size_t size)
void AllocatorDelete(T *ptr)