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
| #ifndef my_debug_malloc_h
#define my_debug_malloc_h
// décommenter pour débugger les malloc/free
#define MY_DEBUG_MALLOC
#include <vector>
#include <sstream>
#include <string>
#include <algorithm>
#include <iostream>
#ifdef MY_DEBUG_MALLOC
#define MALLOC_DEBUG(s) malloc_debug((s), __FILE__, __LINE__)
#define FREE_DEBUG(p) free_debug(p)
#define SHOW_DEBUG_ALLOC() do { show_debug_alloc(); } while (0)
class allocation
{
private:
void* m_p;
std::size_t m_length;
std::string m_file;
int m_line;
public:
allocation() : m_p(NULL), m_length(0), m_file(""), m_line(0) { }
allocation(void * p, std::size_t length, std::string filename, int line) : m_p(p), m_length(length), m_file(filename), m_line(line) {}
allocation(const allocation& other)
: m_p(other.m_p)
, m_length(other.m_length)
, m_file(other.m_file)
, m_line(other.m_line)
{ }
void swap(allocation& other)
{
std::swap(m_p, other.m_p);
std::swap(m_length, other.m_length);
std::swap(m_file,other.m_file);
std::swap(m_line, other.m_line);
}
allocation& operator=(const allocation& other)
{
allocation(other).swap(*this);
return *this;
}
const void* pointer() const { return m_p; }
const std::string& filename() const { return m_file; }
std::size_t length() const { return m_length; }
int line() const { return m_line; }
};
struct allocation_comp
{
void* m_p;
allocation_comp(void *p) : m_p(p) { }
bool operator()(const allocation& a)
{ return a.pointer() == m_p; }
};
inline std::vector<allocation>& get_allocations()
{
static std::vector<allocation> allocations;
return allocations;
}
inline void *malloc_debug(std::size_t length, const char* filename, int line)
{
void* p = malloc(length);
get_allocations().push_back(allocation(p, length, (std::string)filename, line));
return p;
}
inline void free_debug(void* p)
{
std::vector<allocation>::iterator it;
it = std::find_if(get_allocations().begin(), get_allocations().end(), allocation_comp(p));
if (it != get_allocations().end()) {
get_allocations().erase(it);
}
free(p);
}
inline void show_debug_alloc()
{
std::vector<allocation>& allocs = get_allocations();
for (std::size_t i=0; i<allocs.size(); ++i) {
std::stringstream out;
out << "p = " << allocs[i].pointer() << "of size " << allocs[i].length() <<
" allocated in file " << allocs[i].filename() << " line " << allocs[i].line() << std::endl;
std::cout << out.str();
}
}
#else
#define MALLOC_DEBUG(s) malloc(s)
#define FREE_DEBUG(p) free(p)
#define SHOW_DEBUG_ALLOC()
#endif
#endif // my_debug_malloc_h |
Partager