Next: Example 10, Previous: Example 8, Up: Examples
MP_MALLOC() functionsThe mpatrol library comes with a set of alternative dynamic memory allocation functions for C. These allow it to record the type and type size of every memory allocation made through these functions, which can be very useful for debugging purposes. It also means that the alignment for each memory allocation can be determined according to its type. The following test can be found in tests/pass/test9.c.
23 /*
24 * Allocates 16 floats and then resizes the allocation to 8 floats and
25 * frees them. Then allocates 16 integers and resizes the allocation
26 * to 32 integers before freeing them. Finally, duplicates a string
27 * and then frees it.
28 */
31 #include "mpatrol.h"
34 int main(void)
35 {
36 float *f;
37 int *i;
38 char *s;
40 MP_MALLOC(f, 16, float);
41 MP_REALLOC(f, 8, float);
42 MP_FREE(f);
43 MP_CALLOC(i, 16, int);
44 MP_REALLOC(i, 32, int);
45 MP_FREE(i);
46 MP_STRDUP(s, "test");
47 MP_FREE(s);
48 return EXIT_SUCCESS;
49 }
If this test is compiled and linked with the mpatrol library and then run with the LOGALL option, the following output will be seen in the mpatrol log file.
ALLOC: xmalloc (84, 64 bytes, 4 bytes) [main|test9.c|40] (float x 16)
0x0804AC36 main+38
0x400A09CB __libc_start_main+255
0x0804AB81 _start+33
returns 0x080510E8
REALLOC: xrealloc (0x080510E8, 32 bytes, 4 bytes) [main|test9.c|41] (float x 8)
0x0804AC60 main+80
0x400A09CB __libc_start_main+255
0x0804AB81 _start+33
0x080510E8 (64 bytes) {xmalloc:84:0} [main|test9.c|40] (float x 16)
0x0804AC36 main+38
0x400A09CB __libc_start_main+255
0x0804AB81 _start+33
returns 0x080510E8
FREE: xfree (0x080510E8) [main|test9.c|42]
0x0804AC7F main+111
0x400A09CB __libc_start_main+255
0x0804AB81 _start+33
0x080510E8 (32 bytes) {xrealloc:84:1} [main|test9.c|41] (float x 8)
0x0804AC60 main+80
0x400A09CB __libc_start_main+255
0x0804AB81 _start+33
ALLOC: xcalloc (85, 64 bytes, 4 bytes) [main|test9.c|43] (int x 16)
0x0804ACB2 main+162
0x400A09CB __libc_start_main+255
0x0804AB81 _start+33
returns 0x080510E8
REALLOC: xrealloc (0x080510E8, 128 bytes, 4 bytes) [main|test9.c|44] (int x 32)
0x0804ACDF main+207
0x400A09CB __libc_start_main+255
0x0804AB81 _start+33
0x080510E8 (64 bytes) {xcalloc:85:0} [main|test9.c|43] (int x 16)
0x0804ACB2 main+162
0x400A09CB __libc_start_main+255
0x0804AB81 _start+33
returns 0x080510E8
FREE: xfree (0x080510E8) [main|test9.c|45]
0x0804ACFE main+238
0x400A09CB __libc_start_main+255
0x0804AB81 _start+33
0x080510E8 (128 bytes) {xrealloc:85:1} [main|test9.c|44] (int x 32)
0x0804ACDF main+207
0x400A09CB __libc_start_main+255
0x0804AB81 _start+33
ALLOC: xstrdup (86, 5 bytes, 1 byte) [main|test9.c|46] (char x 5)
0x0804AD2E main+286
0x400A09CB __libc_start_main+255
0x0804AB81 _start+33
returns 0x080510E5
FREE: xfree (0x080510E5) [main|test9.c|47]
0x0804AD4F main+319
0x400A09CB __libc_start_main+255
0x0804AB81 _start+33
0x080510E5 (5 bytes) {xstrdup:86:0} [main|test9.c|46] (char x 5)
0x0804AD2E main+286
0x400A09CB __libc_start_main+255
0x0804AB81 _start+33
As you can see, the type and number of items allocated of that type are
associated with each memory allocation. The function names that are logged
as having made the memory allocations are from the xmalloc() family of
functions since that is how the MP_MALLOC() family of functions are
implemented.