Sie können keine intelligenten Zeiger in C verwenden, da sie nicht die erforderliche Syntax bereitstellen, aber Sie können Lecks mit Übung vermeiden. Schreiben Sie den Ressourcenfreigabecode sofort nach der Zuweisung. Also, wenn Sie eine malloc
schreiben, sollten Sie die entsprechende free
sofort in einem Bereinigung Abschnitt schreiben.
In CI finden Sie in der ‚GOTO Bereinigung‘ Muster eine Menge:
int foo()
{
int *resource = malloc(1000);
int retVal = 0;
//...
if (time_to_exit())
{
retVal = 123;
goto cleanup;
}
cleanup:
free(resource);
return retVal;
}
In C auch eine Menge von Kontexten verwendet werden, die wir Sachen zuweisen, kann die gleiche Regel für das auch angewendet werden:
int initializeStuff(Stuff *stuff)
{
stuff->resource = malloc(sizeof(Resource));
if (!stuff->resource)
{
return -1; ///< Fail.
}
return 0; ///< Success.
}
void cleanupStuff(Stuff *stuff)
{
free(stuff->resource);
}
Dies ist analog zu den Objektkonstruktoren und Destruktoren. Solange Sie die zugewiesenen Ressourcen nicht an andere Objekte weitergeben, wird es nicht undicht und Zeiger werden nicht baumeln.
Es ist nicht schwer, einen benutzerdefinierten Zuordner zu schreiben, der Zuweisungen verfolgt und undichte Blöcke atexit
schreibt.
Wenn Sie Zeiger auf die zugewiesenen Ressourcen verschenken müssen, können Sie Wrapperkontexte dafür erstellen, und jedes Objekt besitzt einen Wrapperkontext anstelle der Ressource. Diese Wrapper teilen sich die Ressource und ein Counter-Objekt, das die Nutzung verfolgt und die Objekte freigibt, wenn niemand sie benutzt. So funktioniert C++ 11's shared_ptr
und weak_ptr
. Es wird hier genauer beschrieben: How does weak_ptr work?
Wie funktioniert es? Wie kann es die Zeigerzuordnungen verfolgen? – Calmarius
@Calmarius Es gibt verschiedene Möglichkeiten, wie sie funktionieren. Siehe: http://en.wikipedia.org/wiki/Garbage_collection_(computer_science) –
Ich sehe. Ich habe nach dem GC gefragt, den du verlinkt hast. Es behauptet, es funktioniert auf nicht modifizierten C-Programmen, indem nur die malloc und realloc ersetzt. Aber wie findet es die Zeiger, die auf den zugewiesenen Block zeigen? Sie können im Programm kopiert werden. – Calmarius