C-Programmierung

STL Zeiger

STL Iterator Beispiel | | Boost

Das Problem der vergessenen Deallozierung von Speicher wird in Java mittels der Garbage-Collection umgangen. Mit Hilfe des C++11 Standards lässt sich das Problem ebenfalls ganz ohne aufwändige Garbage-Collection elegant lösen:

Man verwendet dazu das sogenannte reference counting, d.h. das Mitzählen, wie viele Referenzen es auf ein bestimmtes Objekt vom Typ T gibt. Gibt es keine Referenz mehr, kann das Objekt dealloziert werden. Dazu verwendet man templatisierte Zeiger, welche das Mitzählen und Deallozieren übernehmen, daher nennt man diese auch Smart Pointer.

Beispiel mit der C++11 STL-Klasse std::shared_pointer<T> als Smart Pointer:

{
   std::shared_pointer<T> pointer(new T);
   pointer -> do_something();

   {
      std::shared_pointer<T> another_pointer = pointer;
      another_pointer -> do_something();
   } // smart pointer goes out-of-scope, but there is still a reference

} // smart pointer goes out-of-scope, so does the referenced object

Der Zugriff auf das Objekt mittels std::shared_pointer ist thread-safe und wird daher unter Umständen geblockt, wenn zwei Threads parallel darauf zugreifen wollen. Mit std::shared_pointer können also mehrere Threads auf ein und dasselbe Objekt sicher zugreifen. Wenn die zugreifenden Threads nicht mehr existieren, werden auch die gemeinsam referenzierten Objekte automatisch freigegeben.

Wenn ein Objekt nicht gemeinsam sondern exklusive benutzt werden soll, so ist nur eine einziger Smart Pointer notwendig, welcher die einzige Referenz auf das Objekt vom Typ T herstellt. In diesem Fall verwendet man den Smart Pointer Typ std::unique_pointer<T>. Eine Blockierung erfolgt in diesem Fall naturgemäß nicht. Man sagt, dass der Smart Pointer das Objekt besitzt (smart pointer takes ownership of the object):

std::unique_ptr<T> pointer = std::unique_ptr<T>(new T);

Mit Hilfe des C++14 Standards läßt sich ein solches Objekt vom Typ T wie folgt allozieren:

auto pointer = std::make_unique<T>();

Wenn der Smart Pointer nicht mehr existiert, wird auch das referenzierte Objekt automatisch gelöscht.

STL Iterator Beispiel | | Boost

Options: