La pregunta es un poco antigua, pero pensé que me tomaría el tiempo para vincular a mi smart pointer library para los compiladores de GNU (GCC, Clang, ICC, MinGW, ...).
Esta aplicación se basa en el atributo variable de la limpieza, una extensión de GNU, para liberar automáticamente la memoria al salir de su alcance, y como tal, es no ISO C99, C99, pero con extensiones de GNU.
Ejemplo:
simple1.c:
#include <stdio.h>
#include <csptr/smart_ptr.h>
int main(void) {
smart int *some_int = unique_ptr(int, 1);
printf("%p = %d\n", some_int, *some_int);
// some_int is destroyed here
return 0;
}
Compilación & Valgrind sesión:
$ gcc -std=gnu99 -o simple1 simple1.c -lcsptr
$ valgrind ./simple1
==3407== Memcheck, a memory error detector
==3407== Copyright (C) 2002-2013, and GNU GPL\'d, by Julian Seward et al.
==3407== Using Valgrind-3.10.0 and LibVEX; rerun with -h for copyright info
==3407== Command: ./simple1
==3407==
0x53db068 = 1
==3407==
==3407== HEAP SUMMARY:
==3407== in use at exit: 0 bytes in 0 blocks
==3407== total heap usage: 1 allocs, 1 frees, 48 bytes allocated
==3407==
==3407== All heap blocks were freed -- no leaks are possible
==3407==
==3407== For counts of detected and suppressed errors, rerun with: -v
==3407== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 0 from 0)
¿Cómo funciona? ¿Cómo puede rastrear las asignaciones de puntero? – Calmarius
@ Calmarius Hay varias formas en que funcionan. Ver: http://en.wikipedia.org/wiki/Garbage_collection_(computer_science) –
Ya veo. Pregunté sobre el GC que vinculó. Afirma que funciona en programas C no modificados, reemplazando solo el malloc y el realloc. Pero, ¿cómo ubica los punteros que apuntan al bloque asignado? Se pueden copiar en el programa. – Calmarius