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(
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();
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) {
86 for (
auto i = fct_object_list.begin(); i != fct_object_list.end(); i++) {
87 out << (*i)->describe << std::endl;
89 out <<
"不在object表里不delete的数量:" << fct_object_count_delete_without_object << std::endl;
90 out <<
"未释放对象总计:" << fct_object_list.size() << std::endl;
93 inline void _add_object(
void* ptr,
const std::string& describe)
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();
103 inline bool _remove_object(
void* ptr)
105 auto i = fct_object_list.begin();
106 for (; i != fct_object_list.end(); i++) {
107 if ((*i)->pointer == ptr) {
109 fct_object_list.erase(i);
113 fct_object_count_delete_without_object++;
122 FCT::_remove_object(ptr);
124 operator delete[](ptr);
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));
134 return static_cast<T*
>(
operator new[](
sizeof(T) * size));
140 return new (ptr) T();
143 template<
typename T,
typename... Args>
144 inline T*
New(T* ptr, Args&&... args)
146 return new (ptr) T(std::forward<Args>(args)...);
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)
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
167#define FCT_SAFE_NEW(var,type,...) \
170 var = FCT_NEW(type, __VA_ARGS__)
171#define FCT_SAFE_DELETE(var) \
T * AllocatorNew(size_t size)
void AllocatorDelete(T *ptr)