<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-1312036047635172421</id><updated>2011-04-22T02:24:20.945+02:00</updated><category term='Linux - Kernel Programmierung'/><category term='Windows Netzwerke'/><category term='Boost'/><category term='Allerlei'/><category term='C/C++'/><title type='text'>About Informationtechnologies</title><subtitle type='html'></subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://aboutinformationtechnologies.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1312036047635172421/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://aboutinformationtechnologies.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Christoph Jud</name><uri>http://www.blogger.com/profile/12319992956473639407</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>6</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-1312036047635172421.post-1413110228837311603</id><published>2008-01-02T14:57:00.001+01:00</published><updated>2008-01-04T11:35:56.510+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Boost'/><category scheme='http://www.blogger.com/atom/ns#' term='C/C++'/><title type='text'>Systemunabhängiger Code mit Boost</title><content type='html'>&lt;p class="MsoNormal"&gt;&lt;br /&gt;Bereits im letzten Beitrag habe ich die Boost-Library erwähnt, als ich ein praktisches Beispiel über den Umgang mit RAII-Objekten listete. Allerdings genügt nicht immer eine einfache Inkludierung der entsprechenden Headerdatei. So müssen für einige Teile der Bibliothek Shared-Libraries installiert werden, da diese systemabhängige Teile kapseln. Hierbei handelt es sich um:&lt;/br&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style:italic;"&gt;date_time, filesystem, graph, iostreams, program_options, python, regex, serialization, signals, test, thread, wave&lt;/span&gt;&lt;/br&gt;&lt;br /&gt;&lt;br /&gt;In diesem Beitrag werde ich anhand eines Beispiels mit Threads zeigen, wie man diese Bibliotheken richtig kompiliert und installiert. Man wird sehen, dass der exakt selbe Sourcecode danach unter Linux und Windows kompiliert und ausgeführt werden kann.&lt;/br&gt;&lt;br /&gt;Das Beispiel-Programm sieht folgendermassen aus:&lt;br /&gt;&lt;br /&gt;&lt;pre style="color:#000000; background-color:#ffffff; font-size:10pt; font-family:Courier New;"&gt;&lt;span style="color:#888888"&gt;    1 &lt;/span&gt;&lt;span style="color:#0b810d"&gt;#include &amp;lt;boost/thread/thread.hpp&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#888888"&gt;    2 &lt;/span&gt;&lt;span style="color:#0b810d"&gt;#include &amp;lt;boost/thread/xtime.hpp&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#888888"&gt;    3 &lt;/span&gt;&lt;span style="color:#0b810d"&gt;#include &amp;lt;boost/bind.hpp&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#888888"&gt;    4 &lt;/span&gt;&lt;span style="color:#0b810d"&gt;#include &amp;lt;boost/thread/mutex.hpp&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#888888"&gt;    5 &lt;/span&gt;&lt;span style="color:#0b810d"&gt;#include &amp;lt;iostream&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#888888"&gt;    6 &lt;/span&gt;&lt;span style="color:#0b810d"&gt;#include &amp;lt;cstdlib&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#888888"&gt;    7 &lt;/span&gt;&lt;br /&gt;&lt;span style="color:#888888"&gt;    8 &lt;/span&gt;boost&lt;span style="color:#000000"&gt;::&lt;/span&gt;mutex cnt_mutex&lt;span style="color:#000000"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#888888"&gt;    9 &lt;/span&gt;&lt;br /&gt;&lt;span style="color:#888888"&gt;   10 &lt;/span&gt;&lt;span style="color:#0000ff"&gt;void&lt;/span&gt; &lt;span style="color:#000000; font-weight:bold"&gt;helloworld&lt;/span&gt;&lt;span style="color:#000000"&gt;(&lt;/span&gt;&lt;span style="color:#0000ff"&gt;unsigned int&lt;/span&gt; n &lt;span style="color:#000000"&gt;=&lt;/span&gt; &lt;span style="color:#7e0050"&gt;1&lt;/span&gt;&lt;span style="color:#000000"&gt;)&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#888888"&gt;   11 &lt;/span&gt;&lt;span style="color:#000000"&gt;{&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#888888"&gt;   12 &lt;/span&gt;    &lt;span style="color:#000000"&gt;{&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#888888"&gt;   13 &lt;/span&gt;         boost&lt;span style="color:#000000"&gt;::&lt;/span&gt;mutex&lt;span style="color:#000000"&gt;::&lt;/span&gt;scoped_lock &lt;span style="color:#000000; font-weight:bold"&gt;lock&lt;/span&gt;&lt;span style="color:#000000"&gt;(&lt;/span&gt;cnt_mutex&lt;span style="color:#000000"&gt;);&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#888888"&gt;   14 &lt;/span&gt;         std&lt;span style="color:#000000"&gt;::&lt;/span&gt;cout &lt;span style="color:#000000"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span style="color:#82604a"&gt;&amp;quot;Thread &amp;quot;&lt;/span&gt; &lt;span style="color:#000000"&gt;&amp;lt;&amp;lt;&lt;/span&gt; n &lt;span style="color:#000000"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span style="color:#82604a"&gt;&amp;quot;: Hello World!&amp;quot;&lt;/span&gt; &lt;span style="color:#000000"&gt;&amp;lt;&amp;lt;&lt;/span&gt; std&lt;span style="color:#000000"&gt;::&lt;/span&gt;endl&lt;span style="color:#000000"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#888888"&gt;   15 &lt;/span&gt;    &lt;span style="color:#000000"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#888888"&gt;   16 &lt;/span&gt;    boost&lt;span style="color:#000000"&gt;::&lt;/span&gt;xtime xt&lt;span style="color:#000000"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#888888"&gt;   17 &lt;/span&gt;    boost&lt;span style="color:#000000"&gt;::&lt;/span&gt;&lt;span style="color:#000000; font-weight:bold"&gt;xtime_get&lt;/span&gt;&lt;span style="color:#000000"&gt;(&amp;amp;&lt;/span&gt;xt&lt;span style="color:#000000"&gt;,&lt;/span&gt; boost&lt;span style="color:#000000"&gt;::&lt;/span&gt;TIME_UTC&lt;span style="color:#000000"&gt;);&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#888888"&gt;   18 &lt;/span&gt;    xt&lt;span style="color:#000000"&gt;.&lt;/span&gt;sec &lt;span style="color:#000000"&gt;+=&lt;/span&gt; &lt;span style="color:#7e0050"&gt;60&lt;/span&gt;&lt;span style="color:#000000"&gt;*&lt;/span&gt;&lt;span style="color:#7e0050"&gt;60&lt;/span&gt;&lt;span style="color:#000000"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#888888"&gt;   19 &lt;/span&gt;    boost&lt;span style="color:#000000"&gt;::&lt;/span&gt;thread&lt;span style="color:#000000"&gt;::&lt;/span&gt;&lt;span style="color:#000000; font-weight:bold"&gt;sleep&lt;/span&gt;&lt;span style="color:#000000"&gt;(&lt;/span&gt;xt&lt;span style="color:#000000"&gt;);&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#888888"&gt;   20 &lt;/span&gt;&lt;span style="color:#000000"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#888888"&gt;   21 &lt;/span&gt;&lt;br /&gt;&lt;span style="color:#888888"&gt;   22 &lt;/span&gt;&lt;span style="color:#0000ff"&gt;int&lt;/span&gt; &lt;span style="color:#000000; font-weight:bold"&gt;main&lt;/span&gt;&lt;span style="color:#000000"&gt;()&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#888888"&gt;   23 &lt;/span&gt;&lt;span style="color:#000000"&gt;{&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#888888"&gt;   24 &lt;/span&gt;    boost&lt;span style="color:#000000"&gt;::&lt;/span&gt;thread_group thrd&lt;span style="color:#000000"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#888888"&gt;   25 &lt;/span&gt;&lt;br /&gt;&lt;span style="color:#888888"&gt;   26 &lt;/span&gt;    &lt;span style="color:#0000ff; font-weight:bold"&gt;for&lt;/span&gt;&lt;span style="color:#000000"&gt;(&lt;/span&gt;&lt;span style="color:#0000ff"&gt;int&lt;/span&gt; i&lt;span style="color:#000000"&gt;=&lt;/span&gt;&lt;span style="color:#7e0050"&gt;0&lt;/span&gt;&lt;span style="color:#000000"&gt;;&lt;/span&gt; i&lt;span style="color:#000000"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#7e0050"&gt;5&lt;/span&gt;&lt;span style="color:#000000"&gt;;&lt;/span&gt; i&lt;span style="color:#000000"&gt;++){&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#888888"&gt;   27 &lt;/span&gt;        thrd&lt;span style="color:#000000"&gt;.&lt;/span&gt;&lt;span style="color:#000000; font-weight:bold"&gt;create_thread&lt;/span&gt;&lt;span style="color:#000000"&gt;(&lt;/span&gt;boost&lt;span style="color:#000000"&gt;::&lt;/span&gt;&lt;span style="color:#000000; font-weight:bold"&gt;bind&lt;/span&gt;&lt;span style="color:#000000"&gt;(&lt;/span&gt;helloworld&lt;span style="color:#000000"&gt;,&lt;/span&gt;i&lt;span style="color:#000000"&gt;));&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#888888"&gt;   28 &lt;/span&gt;    &lt;span style="color:#000000"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#888888"&gt;   29 &lt;/span&gt;    thrd&lt;span style="color:#000000"&gt;.&lt;/span&gt;&lt;span style="color:#000000; font-weight:bold"&gt;join_all&lt;/span&gt;&lt;span style="color:#000000"&gt;();&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#888888"&gt;   30 &lt;/span&gt;&lt;br /&gt;&lt;span style="color:#888888"&gt;   31 &lt;/span&gt;&lt;br /&gt;&lt;span style="color:#888888"&gt;   32 &lt;/span&gt;    &lt;span style="color:#000000; font-weight:bold"&gt;system&lt;/span&gt;&lt;span style="color:#000000"&gt;(&lt;/span&gt;&lt;span style="color:#82604a"&gt;&amp;quot;PAUSE&amp;quot;&lt;/span&gt;&lt;span style="color:#000000"&gt;);&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#888888"&gt;   33 &lt;/span&gt;    &lt;span style="color:#0000ff; font-weight:bold"&gt;return&lt;/span&gt; EXIT_SUCCESS&lt;span style="color:#000000"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#888888"&gt;   34 &lt;/span&gt;&lt;span style="color:#000000"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;   &lt;li&gt;In der Funktion &lt;span style="font-size:85%; font-family:courier new;"&gt;main&lt;/span&gt; wir eine Thread-Group mit fünf Threads initialisiert, die alle die Funktion &lt;span style="font-size:85%; font-family:courier new;"&gt;helloworld&lt;/span&gt; aufrufen.&lt;/li&gt;&lt;br /&gt;   &lt;li&gt;&lt;span style="font-size:85%; font-family:courier new;"&gt;bind&lt;/span&gt; erstellt hier ein Funktionsobjekt mit dem entsprechenden Argument (hier die Nummerierung der Threads).&lt;/li&gt;&lt;br /&gt;   &lt;li&gt;Mit dem globalen Mutex wird der &lt;span style="font-size:85%; font-family:courier new;"&gt;cout&lt;/span&gt; vor gleichzeitigem Zugriff der Threads gesichert (durch &lt;span style="font-size:85%; font-family:courier new;"&gt;scoped_lock&lt;/span&gt; wird der Mutex ähnlich wie beim &lt;span style="font-size:85%; font-family:courier new;"&gt;shared_ptr&lt;/span&gt; am Ende seines Gültigkeitsbereichs wieder freigegeben).&lt;/li&gt;&lt;br /&gt;   &lt;li&gt;Anschliessend werden die Threads schlafen gelegt (nur so zum Spass).&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p class="MsoNormal"&gt;&lt;b style="font-size:130%;"&gt;Installation unter Linux&lt;/b&gt;&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;   &lt;li&gt;Im root-Verzeichnis von Boost mit &lt;span style="font-size:85%; font-family:courier new;"&gt;configure&lt;/span&gt; die Installation konfigurieren:&lt;/br&gt;&lt;br /&gt;&lt;span style="font-size:85%; font-family:courier new;"&gt;./configure --with-libraries=thread --libdir=/usr/local/lib --includedir=/usr/local/include&lt;/span&gt;&lt;/br&gt;&lt;br /&gt;(weitere Bibliotheken können dem Argument &lt;span style="font-size:85%; font-family:courier new;"&gt;with-libraries&lt;/span&gt; komagetrennt angefügt werden).&lt;/li&gt;&lt;br /&gt;   &lt;li&gt;&lt;span style="font-size:85%; font-family:courier new;"&gt;make &amp; make install&lt;/span&gt;&lt;/li&gt;&lt;br /&gt;   &lt;li&gt;&lt;span style="font-size:85%; font-family:courier new;"&gt;vi /etc/ld.so.conf&lt;/span&gt;&lt;/br&gt;&lt;br /&gt;&lt;span style="font-size:85%; font-family:courier new;"&gt;+/usr/local/lib&lt;/span&gt;&lt;/br&gt;&lt;br /&gt;So wird dem System bekannt gemacht wo sich die Shared-Libraries befinden wenn ein Programm darauf zugreifen möchte.&lt;/li&gt;&lt;br /&gt;   &lt;li&gt;run: &lt;span style="font-size:85%; font-family:courier new;"&gt;ldconfig&lt;/span&gt;&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;Ein Programm kann anschliessend wie folgt übersetzt werden:&lt;br /&gt;&lt;span style="font-size:85%; font-family:courier new;"&gt;gcc -I/usr/local/include/boost_1_34_1 -L/usr/local/lib -lboost_thread-gcc41-mt-1_34_1 boost_test.cpp -o boost_test&lt;/span&gt;&lt;/br&gt;&lt;/br&gt;&lt;br /&gt;&lt;br /&gt;Oder mit dem folgenden Makefile:&lt;/br&gt;&lt;br /&gt;&lt;listing&gt;&lt;br /&gt;CC      = gcc&lt;br /&gt;OBJECTS = boost_test.o&lt;br /&gt;LIBS    = -L/usr/local/lib -lboost_thread-gcc41-mt-1_34_1 -L/usr/lib&lt;br /&gt;LIBPATH = -I/usr/local/include/boost_1_34_1&lt;br /&gt;CFLAGS  = -c -O&lt;br /&gt;&lt;br /&gt;boost_test: $(OBJECTS)&lt;br /&gt;        $(CC) -o $@ $(OBJECTS) $(LIBS)&lt;br /&gt;&lt;br /&gt;boost_test.o: boost_test.cpp&lt;br /&gt;        $(CC) $(CFLAGS) $(LIBPATH) $*.cpp&lt;br /&gt;&lt;br /&gt;clean:&lt;br /&gt;        rm *.o boost_test&lt;br /&gt;&lt;/listing&gt;&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;p class="MsoNormal"&gt;&lt;b style="font-size:130%;"&gt;Installation unter Windows&lt;/b&gt;&lt;br /&gt;Unter Windows erfordert die Installation mehr Schritte. Ich verwende einerseits die Entwicklungsumbebung &lt;span style="font-style:italic;"&gt;Dev-C++ 4.9.9.2&lt;/span&gt; mit dem &lt;span style="font-style:italic;"&gt;GNU GCC 3.4.5&lt;/span&gt; Compiler und andererseits &lt;span style="font-style:italic;"&gt;Microsoft Visual C++ 2008 Express Edition&lt;/span&gt; mit dem &lt;span style="font-style:italic;"&gt;Microsoft 32-bit C/C++ Optimizing Compiler Version 15&lt;/span&gt;. &lt;/br&gt;&lt;br /&gt;&lt;br /&gt;Um die Bibliotheken kompilieren zu können, muss BJam separat installiert werden. Eine detaillierte Anleitung hierfür finden sie &lt;a href="http://www.boost.org/doc/html/jam/building.html"&gt;hier&lt;/a&gt;. &lt;/br&gt;&lt;br /&gt;&lt;br /&gt;Meine Umgebungsvariablen sehen wie folgt aus:&lt;/br&gt;&lt;br /&gt;&lt;span style="font-size:85%; font-family:courier new;"&gt;&lt;br /&gt;DevEnvDir=C:\Programme\Microsoft Visual Studio 9.0\Common7\IDE&lt;br /&gt;&lt;br/&gt;PATH=%PATH%;C:\Programme\Microsoft Visual Studio 9.0\Common7\IDE;C:\Programme\Microsoft Visual Studio 9.0\VC\BIN;C:\Programme\Microsoft Visual Studio 9.0\Common7\Tools;C:\WINDOWS\Microsoft.NET\Framework\v3.5;C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727;C:\Programme\Microsoft Visual Studio 9.0\VC\VCPackages;C:\Boost\lib&lt;br /&gt;&lt;br/&gt;INCLUDE=C:\Programme\Microsoft Visual Studio 9.0\VC\INCLUDE;C:\Boost\include\boost-1_34_1&lt;br /&gt;&lt;br/&gt;LIB=C:\Programme\Microsoft Visual Studio 9.0\VC\LIB;C:\Boost\lib&lt;br /&gt;&lt;br/&gt;LIBPATH=C:\WINDOWS\Microsoft.NET\Framework\v3.5;C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727;C:\Programme\Microsoft Visual Studio 9.0\VC\LIB;C:\Boost\lib&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;b style=""&gt;Patchen vor Beginn:&lt;/b&gt;&lt;br /&gt;Die Boost-Bibliothek 1.34.1 ist noch nicht für Visual C++ 9.0 upgedated worden. Darum sollten vor Beginn der Installation folgende Zeilen in den Sourcen angepasst werden:&lt;br /&gt;&lt;a href="http://lists.boost.org/boost-users/2007/05/27696.php"&gt;lists.boost.org&lt;/a&gt;&lt;/br&gt;&lt;br /&gt;&lt;br /&gt;(Falls der Link nicht mehr aktuell ist finden Sie die erforderlichen Änderungen am Ende dieses Posts)&lt;br /&gt;&lt;br /&gt;&lt;b style=""&gt;Installieren von BJam (mit msvc):&lt;/b&gt;&lt;br /&gt;&lt;span style="font-size:85%; font-family:courier new;"&gt;c:\...\boost_1_34_1\tools\jam\build_dist.bat&lt;/span&gt;&lt;br /&gt;oder&lt;br /&gt;&lt;span style="font-size:85%; font-family:courier new;"&gt;c:\...\boost_1_34_1\tools\jam\src\build.bat msvc&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;b style=""&gt;Installieren/Kompillieren der gewünschten Libraries:&lt;/b&gt;&lt;br /&gt;&lt;span style="font-size:85%; font-family:courier new;"&gt;%path_to_bjam% --toolset=compiler --with-%library-list% install&lt;/span&gt;&lt;br /&gt;z.B.&lt;br /&gt;&lt;span style="font-size:85%; font-family:courier new;"&gt;c:\...\boost_1_34_1&gt;tools\jam\src\boost-jam-3.1.14-1-ntx86\bjam --toolset=msvc --with-thread install&lt;br /&gt;c:\...\boost_1_34_1&gt;tools\jam\src\boost-jam-3.1.14-1-ntx86\bjam --toolset=gcc --with-thread install&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;b style=""&gt;Projekteinstellungen:&lt;/b&gt;&lt;br /&gt;Bei beiden Entwicklungsumgebungen muss nun das include- und lib-Verzeichnis angegeben werden:&lt;/br&gt;&lt;br /&gt;&lt;span style="font-size:85%; font-family:courier new;"&gt;C:\Boost\include\boost-1_34_1&lt;/br&gt;&lt;br /&gt;C:\Boost\lib&lt;/span&gt;&lt;/br&gt;&lt;br /&gt; &lt;br /&gt;Bei Dev-C++ müssen zusätzlich die Bibliotheken unter dem Register Parameter dem Linker bekannt gemacht werden. VC++ findet dies über die Umgebungsvariablen.&lt;/br&gt;&lt;br /&gt;&lt;br /&gt;&lt;b style=""&gt;Ausgabe des Programms:&lt;/b&gt;&lt;br /&gt; &lt;/br&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_b8WdzBBgi5c/R3uc7bHND8I/AAAAAAAAACI/Hct8fX854mE/s1600-h/thread_ausgabe.PNG"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://4.bp.blogspot.com/_b8WdzBBgi5c/R3uc7bHND8I/AAAAAAAAACI/Hct8fX854mE/s400/thread_ausgabe.PNG" border="0" alt=""id="BLOGGER_PHOTO_ID_5150883143532482498" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/br&gt;&lt;br /&gt;Die Reihenfolge muss nicht immer genau diese sein. Im Taskmanager kann man die Anzahl Threads des Programms anzeigen lassen.&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;p class="MsoNormal"&gt;&lt;br /&gt;&lt;b style=""&gt;Boost-Patch für Visual C++ 9.0:&lt;/b&gt;&lt;br /&gt;&lt;listing&gt;&lt;br /&gt;msvc.jam&lt;br /&gt;{&lt;br /&gt;# Even if version is not explicitly specified, try to detect the version&lt;br /&gt;# from the path.&lt;br /&gt;+ if [ MATCH "(Microsoft Visual Studio 9.0)" : $(command) ]&lt;br /&gt;+ {&lt;br /&gt;+ version = 9.0 ;&lt;br /&gt;+ }&lt;br /&gt;+else if [ MATCH "(Microsoft Visual Studio 8)" : $(command) ]&lt;br /&gt;-if [ MATCH "(Microsoft Visual Studio 8)" : $(command) ]&lt;br /&gt;{&lt;br /&gt;version = 8.0 ;&lt;br /&gt;.ProgramFiles = [ path.make [ common.get-program-files-dir ] ] ;&lt;br /&gt;-.known-versions = 8.0 8.0express 7.1 7.1toolkit 7.0 6.0 ;&lt;br /&gt;+.known-versions = 9.0 9.0express 8.0 8.0express 7.1 7.1toolkit 7.0 6.0 ;&lt;br /&gt;# Version aliases&lt;br /&gt;.version-alias-6 = 6.0 ;&lt;br /&gt;.version-alias-6.5 = 6.0 ;&lt;br /&gt;.version-alias-7 = 7.0 ;&lt;br /&gt;.version-alias-8 = 8.0 ;&lt;br /&gt;+.version-alias-9 = 9.0 ;&lt;br /&gt;# Name of the registry key that contains Visual C++ installation path&lt;br /&gt;# (relative to "HKEY_LOCAL_MACHINE\SOFTWARE\\Microsoft"&lt;br /&gt;.version-7.1-reg = "VisualStudio\\7.1\\Setup\\VC" ;&lt;br /&gt;.version-8.0-reg = "VisualStudio\\8.0\\Setup\\VC" ;&lt;br /&gt;.version-8.0express-reg = "VCExpress\\8.0\\Setup\\VC" ;&lt;br /&gt;+.version-9.0-reg = "VisualStudio\\9.0\\Setup\\VC" ;&lt;br /&gt;+.version-9.0express-reg = "VCExpress\\9.0\\Setup\\VC" ;&lt;br /&gt;# Visual C++ Toolkit 2003 do not store its installation path in the registry.&lt;br /&gt;# The environment variable 'VCToolkitInstallDir' and the default installation&lt;br /&gt; &lt;br /&gt;auto_link.hpp&lt;br /&gt;// vc71:&lt;br /&gt;# define BOOST_LIB_TOOLSET "vc71"&lt;br /&gt;-#elif defined(BOOST_MSVC) &amp;&amp; (BOOST_MSVC &gt;= 1400)&lt;br /&gt;+#elif defined(BOOST_MSVC) &amp;&amp; (BOOST_MSVC == 1400)&lt;br /&gt;// vc80:&lt;br /&gt;# define BOOST_LIB_TOOLSET "vc80"&lt;br /&gt;+#elif defined(BOOST_MSVC) &amp;&amp; (BOOST_MSVC &gt;= 1500)&lt;br /&gt;+&lt;br /&gt;+ // vc90:&lt;br /&gt;+# define BOOST_LIB_TOOLSET "vc90"&lt;br /&gt;+&lt;br /&gt;#elif defined(__BORLANDC__)&lt;br /&gt; &lt;br /&gt;visualc.hpp&lt;br /&gt;#error "Compiler not supported or configured - please reconfigure"&lt;br /&gt;#endif&lt;br /&gt;//&lt;br /&gt;-// last known and checked version is 1400 (VC8):&lt;br /&gt;-#if (_MSC_VER &gt; 1400)&lt;br /&gt;+// last known and checked version is 1500 (VC9):&lt;br /&gt;+#if (_MSC_VER &gt; 1500)&lt;br /&gt;# if defined(BOOST_ASSERT_CONFIG)&lt;br /&gt;# error "Unknown compiler version - please run the configure tests and report the results"&lt;br /&gt;# else&lt;br /&gt; &lt;br /&gt;named_slot_map.hpp&lt;br /&gt;|| slot_ == other.slot_));&lt;br /&gt;}&lt;br /&gt;-#if BOOST_WORKAROUND(_MSC_VER, &lt;= 1400)&lt;br /&gt;+#if BOOST_WORKAROUND(_MSC_VER, &lt;= 1500)&lt;br /&gt;void decrement();&lt;br /&gt;void advance(difference_type);&lt;br /&gt;#endif&lt;br /&gt; &lt;br /&gt;named_slot_map.cpp&lt;br /&gt;typedef slot_container_type::const_iterator const_group_iterator;&lt;br /&gt;-#if BOOST_WORKAROUND(_MSC_VER, &lt;= 1400)&lt;br /&gt;+#if BOOST_WORKAROUND(_MSC_VER, &lt;= 1500)&lt;br /&gt;void named_slot_map_iterator::decrement() { assert(false); }&lt;br /&gt;void named_slot_map_iterator::advance(difference_type) { assert(false); }&lt;br /&gt;#endif&lt;br /&gt;&lt;/listing&gt;&lt;br /&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1312036047635172421-1413110228837311603?l=aboutinformationtechnologies.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://aboutinformationtechnologies.blogspot.com/feeds/1413110228837311603/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1312036047635172421&amp;postID=1413110228837311603' title='0 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1312036047635172421/posts/default/1413110228837311603'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1312036047635172421/posts/default/1413110228837311603'/><link rel='alternate' type='text/html' href='http://aboutinformationtechnologies.blogspot.com/2008/01/systemunabhngiger-code-mit-boost.html' title='Systemunabhängiger Code mit Boost'/><author><name>Christoph Jud</name><uri>http://www.blogger.com/profile/12319992956473639407</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_b8WdzBBgi5c/R3uc7bHND8I/AAAAAAAAACI/Hct8fX854mE/s72-c/thread_ausgabe.PNG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1312036047635172421.post-1197417499087355159</id><published>2007-12-12T15:41:00.000+01:00</published><updated>2008-01-04T11:52:39.815+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='C/C++'/><title type='text'>Objekte als Ressourcenverwaltung</title><content type='html'>&lt;p class="MsoNormal"&gt;&lt;b style=""&gt;Problem&lt;/b&gt;&lt;br /&gt;Oftmals wird der Sprache C++ angekreidet, dass sie keine automatische Ressourcenverwaltung besässe. In der Tat ist es nicht einfach Ressourcenlecks zu vermeiden. Es gibt aber Techniken, welche diesem Problem entgegen wirken wie zum Beispiel das Verfahren „Ressourcenerwerb ist Initialisierung“ (RAII – Resource Acquisition Is Initialization).&lt;/br&gt;&lt;br /&gt;&lt;br /&gt;&lt;b style=""&gt;Lösung&lt;/b&gt;&lt;br /&gt;Die angeforderte Ressource wird direkt nach ihrer Initialisierung dem Objekt übergeben, welches diese verwaltet. Und sehr wichtig dabei ist die Freigabe der Ressource wenn sie nicht mehr benötigt wird. Ich spreche hier intelligente Zeiger mit Referenzzählung (RCSP – Reference-Counting Smart Pointer) an.&lt;/br&gt;&lt;br /&gt;&lt;br /&gt;&lt;b style=""&gt;Prinzip&lt;/b&gt;&lt;br /&gt;Im ersten Teil dieses Posts werde ich das Prinzip solcher Pointers erläutern und anhand eines Beispieles zeigen wie diese aufgebaut sind. Danach werde ich ein praktisches Beispiel listen anhand der Klasse &lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;shared_ptr&lt;/span&gt;&lt;/span&gt; der Boost-Bibliothek.&lt;/br&gt;&lt;br /&gt;&lt;br /&gt;&lt;b style=""&gt;Objektorientierung&lt;/b&gt;&lt;br /&gt;Die Objektorientierung macht es möglich: der Destruktor jedes Objektes wird spätestens dann aufgerufen, wenn dessen Variable ihren Gültigkeitsbereich verlässt.&lt;/br&gt;&lt;br /&gt;&lt;br /&gt;&lt;b style=""&gt;Einfacher Fall&lt;/b&gt;&lt;br /&gt;Eine angeforderte und initialisierte Ressource wird nun also einem intelligenten Pointer zur Verwaltung übergeben. Der Zugriff auf die Ressource passiert also nur noch über den Pointer. Nun muss dafür gesorgt werden, dass im Destruktor des Pointers dieselbe Ressource wieder frei gegeben wird.&lt;/br&gt;&lt;br /&gt;&lt;br /&gt;&lt;b style=""&gt;Erweiterter Fall&lt;/b&gt;&lt;br /&gt;Wird die Ressource nun über mehrere intelligente Pointer erreichbar, darf sie erst freigegeben werden wenn keiner dieser Pointer mehr auf sie zeigt. Hierfür wird eine Referenzzählung im intelligenten Zeiger benötigt, was nicht weiter schwierig ist zu implementieren.&lt;/br&gt;&lt;br /&gt;&lt;br /&gt;&lt;b style=""&gt;Grenzen&lt;/b&gt;&lt;br /&gt;So wird einiges einfacher doch im Gegensatz zur Garbage Collection ist es so nicht möglich Kreisreferenzen zu brechen.&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p class="MsoNormal"&gt;&lt;b style="font-size:130%;" &gt;Beispiel 1&lt;/b&gt;&lt;br /&gt;Folgendes Listing zeigt das Prinzip eines solchen smart pointer. Die Ressource ist in diesem Fall Speicher für ein Objekt der Klasse Person. Die  Mainfunktion zeigt diverse Fälle wie solch ein Pointer reagiert. Für das Verständnis wichtig ist ebenfalls die Ausgabe dieses Programms.&lt;/br&gt;&lt;br /&gt;&lt;br /&gt;&lt;b style="font-style: italic;"&gt;Achtung:&lt;/b&gt;&lt;span style="font-style: italic;"&gt;&lt;br /&gt;Verwenden sie bitte nicht diese Implementierung eines smart pointer. Dieses Programm habe ich nur zur Veranschaulichung geschrieben. Es besitzt noch diverse Fehlerquellen. Lassen sie sich vom darauf folgenden Beispiel inspirieren, wenn sie ebenfalls smart pointer in ihre Programme einbauen möchten.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre style="color:#000000; background-color:#ffffff; font-size:10pt; font-family:Courier New;"&gt;&lt;span style="color:#888888"&gt;    1 &lt;/span&gt;&lt;span style="color:#0b810d"&gt;#include &amp;lt;cstdlib&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#888888"&gt;    2 &lt;/span&gt;&lt;span style="color:#0b810d"&gt;#include &amp;lt;iostream&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#888888"&gt;    3 &lt;/span&gt;&lt;span style="color:#0b810d"&gt;#include &amp;lt;string&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#888888"&gt;    4 &lt;/span&gt;&lt;br /&gt;&lt;span style="color:#888888"&gt;    5 &lt;/span&gt;&lt;span style="color:#0000ff; font-weight:bold"&gt;using namespace&lt;/span&gt; std&lt;span style="color:#000000"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#888888"&gt;    6 &lt;/span&gt;&lt;br /&gt;&lt;span style="color:#888888"&gt;    7 &lt;/span&gt;&lt;span style="color:#6b6b6b; font-style:italic"&gt;/****************************************************&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#888888"&gt;    8 &lt;/span&gt;&lt;span style="color:#6b6b6b; font-style:italic"&gt;* Dummy-Objekt Person&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#888888"&gt;    9 &lt;/span&gt;&lt;span style="color:#6b6b6b; font-style:italic"&gt;****************************************************/&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#888888"&gt;   10 &lt;/span&gt;&lt;span style="color:#740023"&gt;class&lt;/span&gt; Person&lt;br /&gt;&lt;span style="color:#888888"&gt;   11 &lt;/span&gt;&lt;span style="color:#000000"&gt;{&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#888888"&gt;   12 &lt;/span&gt;&lt;span style="color:#740023"&gt;public&lt;/span&gt;&lt;span style="color:#000000"&gt;:&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#888888"&gt;   13 &lt;/span&gt;    &lt;span style="color:#000000; font-weight:bold"&gt;Person&lt;/span&gt;&lt;span style="color:#000000"&gt;(&lt;/span&gt;string name&lt;span style="color:#000000"&gt;) :&lt;/span&gt; &lt;span style="color:#000000; font-weight:bold"&gt;name&lt;/span&gt;&lt;span style="color:#000000"&gt;(&lt;/span&gt;name&lt;span style="color:#000000"&gt;){}&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#888888"&gt;   14 &lt;/span&gt;&lt;br /&gt;&lt;span style="color:#888888"&gt;   15 &lt;/span&gt;    string &lt;span style="color:#000000; font-weight:bold"&gt;getString&lt;/span&gt;&lt;span style="color:#000000"&gt;()&lt;/span&gt;&lt;span style="color:#0000ff"&gt;const&lt;/span&gt; &lt;span style="color:#000000"&gt;{&lt;/span&gt;&lt;span style="color:#0000ff; font-weight:bold"&gt;return&lt;/span&gt; name&lt;span style="color:#000000"&gt;;}&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#888888"&gt;   16 &lt;/span&gt;    &lt;span style="color:#0000ff"&gt;void&lt;/span&gt; &lt;span style="color:#000000; font-weight:bold"&gt;setName&lt;/span&gt;&lt;span style="color:#000000"&gt;(&lt;/span&gt;string str&lt;span style="color:#000000"&gt;) {&lt;/span&gt; name &lt;span style="color:#000000"&gt;=&lt;/span&gt; str&lt;span style="color:#000000"&gt;; }&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#888888"&gt;   17 &lt;/span&gt;&lt;br /&gt;&lt;span style="color:#888888"&gt;   18 &lt;/span&gt;&lt;span style="color:#740023"&gt;private&lt;/span&gt;&lt;span style="color:#000000"&gt;:&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#888888"&gt;   19 &lt;/span&gt;    string name&lt;span style="color:#000000"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#888888"&gt;   20 &lt;/span&gt;&lt;span style="color:#000000"&gt;};&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#888888"&gt;   21 &lt;/span&gt;&lt;br /&gt;&lt;span style="color:#888888"&gt;   22 &lt;/span&gt;&lt;span style="color:#6b6b6b; font-style:italic"&gt;/****************************************************&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#888888"&gt;   23 &lt;/span&gt;&lt;span style="color:#6b6b6b; font-style:italic"&gt;* RAII-Objekt SmartPtr&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#888888"&gt;   24 &lt;/span&gt;&lt;span style="color:#6b6b6b; font-style:italic"&gt;*&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#888888"&gt;   25 &lt;/span&gt;&lt;span style="color:#6b6b6b; font-style:italic"&gt;* Wichtige Funktionen von SmartPtr&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#888888"&gt;   26 &lt;/span&gt;&lt;span style="color:#6b6b6b; font-style:italic"&gt;* - SmartPtr()&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#888888"&gt;   27 &lt;/span&gt;&lt;span style="color:#6b6b6b; font-style:italic"&gt;* - SmartPtr(T *t)&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#888888"&gt;   28 &lt;/span&gt;&lt;span style="color:#6b6b6b; font-style:italic"&gt;* - SmartPtr&amp;amp; operator=(SmartPtr const&amp;amp; r)&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#888888"&gt;   29 &lt;/span&gt;&lt;span style="color:#6b6b6b; font-style:italic"&gt;* - T* operator-&amp;gt;()const&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#888888"&gt;   30 &lt;/span&gt;&lt;span style="color:#6b6b6b; font-style:italic"&gt;* - ~SmartPtr()&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#888888"&gt;   31 &lt;/span&gt;&lt;span style="color:#6b6b6b; font-style:italic"&gt;****************************************************/&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#888888"&gt;   32 &lt;/span&gt;&lt;span style="color:#740023"&gt;template&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#888888"&gt;   33 &lt;/span&gt;&lt;span style="color:#740023"&gt;class&lt;/span&gt; SmartPtr&lt;br /&gt;&lt;span style="color:#888888"&gt;   34 &lt;/span&gt;&lt;span style="color:#000000"&gt;{&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#888888"&gt;   35 &lt;/span&gt;&lt;span style="color:#740023"&gt;public&lt;/span&gt;&lt;span style="color:#000000"&gt;:&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#888888"&gt;   36 &lt;/span&gt;    &lt;span style="color:#6b6b6b; font-style:italic"&gt;// Konstruktor (immer vor Verwenung der Attribute initialisieren)&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#888888"&gt;   37 &lt;/span&gt;    &lt;span style="color:#000000; font-weight:bold"&gt;SmartPtr&lt;/span&gt;&lt;span style="color:#000000"&gt;() :&lt;/span&gt; &lt;span style="color:#000000; font-weight:bold"&gt;type&lt;/span&gt;&lt;span style="color:#000000"&gt;(&lt;/span&gt;&lt;span style="color:#7e0050"&gt;0&lt;/span&gt;&lt;span style="color:#000000"&gt;),&lt;/span&gt; &lt;span style="color:#000000; font-weight:bold"&gt;references&lt;/span&gt;&lt;span style="color:#000000"&gt;(&lt;/span&gt;&lt;span style="color:#7e0050"&gt;0&lt;/span&gt;&lt;span style="color:#000000"&gt;){};&lt;/span&gt; &lt;span style="color:#6b6b6b; font-style:italic"&gt;// nur zu Testzwecken&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#888888"&gt;   38 &lt;/span&gt;    &lt;span style="color:#000000; font-weight:bold"&gt;SmartPtr&lt;/span&gt;&lt;span style="color:#000000"&gt;(&lt;/span&gt;T &lt;span style="color:#000000"&gt;*&lt;/span&gt;t&lt;span style="color:#000000"&gt;) :&lt;/span&gt; &lt;span style="color:#000000; font-weight:bold"&gt;type&lt;/span&gt;&lt;span style="color:#000000"&gt;(&lt;/span&gt;t&lt;span style="color:#000000"&gt;),&lt;/span&gt; &lt;span style="color:#000000; font-weight:bold"&gt;references&lt;/span&gt;&lt;span style="color:#000000"&gt;(&lt;/span&gt;&lt;span style="color:#0000ff; font-weight:bold"&gt;new&lt;/span&gt; &lt;span style="color:#0000ff"&gt;int&lt;/span&gt;&lt;span style="color:#000000"&gt;(&lt;/span&gt;&lt;span style="color:#7e0050"&gt;1&lt;/span&gt;&lt;span style="color:#000000"&gt;)) {};&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#888888"&gt;   39 &lt;/span&gt;&lt;br /&gt;&lt;span style="color:#888888"&gt;   40 &lt;/span&gt;    &lt;span style="color:#6b6b6b; font-style:italic"&gt;// Kopierzuweisungskonstruktor (sollte immer *this zurückgeben)&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#888888"&gt;   41 &lt;/span&gt;    SmartPtr&lt;span style="color:#000000"&gt;&amp;amp;&lt;/span&gt; &lt;span style="color:#740023"&gt;operator&lt;/span&gt;&lt;span style="color:#000000"&gt;=(&lt;/span&gt;SmartPtr &lt;span style="color:#0000ff"&gt;const&lt;/span&gt;&lt;span style="color:#000000"&gt;&amp;amp;&lt;/span&gt; r&lt;span style="color:#000000"&gt;)&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#888888"&gt;   42 &lt;/span&gt;    &lt;span style="color:#000000"&gt;{&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#888888"&gt;   43 &lt;/span&gt;        &lt;span style="color:#6b6b6b; font-style:italic"&gt;// Selbstzuweisung handeln&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#888888"&gt;   44 &lt;/span&gt;        &lt;span style="color:#0000ff; font-weight:bold"&gt;if&lt;/span&gt;&lt;span style="color:#000000"&gt;(&lt;/span&gt;&lt;span style="color:#0000ff; font-weight:bold"&gt;this&lt;/span&gt; &lt;span style="color:#000000"&gt;== &amp;amp;&lt;/span&gt;r&lt;span style="color:#000000"&gt;)&lt;/span&gt; &lt;span style="color:#0000ff; font-weight:bold"&gt;return&lt;/span&gt; &lt;span style="color:#000000"&gt;*&lt;/span&gt;&lt;span style="color:#0000ff; font-weight:bold"&gt;this&lt;/span&gt;&lt;span style="color:#000000"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#888888"&gt;   45 &lt;/span&gt;&lt;br /&gt;&lt;span style="color:#888888"&gt;   46 &lt;/span&gt;        &lt;span style="color:#6b6b6b; font-style:italic"&gt;// mit swap wäre es eleganter gelösst&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#888888"&gt;   47 &lt;/span&gt;        type &lt;span style="color:#000000"&gt;=&lt;/span&gt; r&lt;span style="color:#000000"&gt;.&lt;/span&gt;type&lt;span style="color:#000000"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#888888"&gt;   48 &lt;/span&gt;        references &lt;span style="color:#000000"&gt;=&lt;/span&gt; r&lt;span style="color:#000000"&gt;.&lt;/span&gt;references&lt;span style="color:#000000"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#888888"&gt;   49 &lt;/span&gt;&lt;br /&gt;&lt;span style="color:#888888"&gt;   50 &lt;/span&gt;        &lt;span style="color:#000000"&gt;*&lt;/span&gt;references &lt;span style="color:#000000"&gt;= *&lt;/span&gt;references &lt;span style="color:#000000"&gt;+&lt;/span&gt; &lt;span style="color:#7e0050"&gt;1&lt;/span&gt;&lt;span style="color:#000000"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#888888"&gt;   51 &lt;/span&gt;        &lt;span style="color:#0000ff; font-weight:bold"&gt;return&lt;/span&gt; &lt;span style="color:#000000"&gt;*&lt;/span&gt;&lt;span style="color:#0000ff; font-weight:bold"&gt;this&lt;/span&gt;&lt;span style="color:#000000"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#888888"&gt;   52 &lt;/span&gt;    &lt;span style="color:#000000"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#888888"&gt;   53 &lt;/span&gt;&lt;br /&gt;&lt;span style="color:#888888"&gt;   54 &lt;/span&gt;    &lt;span style="color:#6b6b6b; font-style:italic"&gt;// Destruktor&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#888888"&gt;   55 &lt;/span&gt;    &lt;span style="color:#6b6b6b; font-style:italic"&gt;// Zerstört das Objekt erst wenn keine Referenz mehr darauf zeigt!!&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#888888"&gt;   56 &lt;/span&gt;    &lt;span style="color:#000000"&gt;~&lt;/span&gt;&lt;span style="color:#000000; font-weight:bold"&gt;SmartPtr&lt;/span&gt;&lt;span style="color:#000000"&gt;()&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#888888"&gt;   57 &lt;/span&gt;    &lt;span style="color:#000000"&gt;{&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#888888"&gt;   58 &lt;/span&gt;        &lt;span style="color:#000000"&gt;*&lt;/span&gt;references &lt;span style="color:#000000"&gt;= *&lt;/span&gt;references &lt;span style="color:#000000"&gt;-&lt;/span&gt; &lt;span style="color:#7e0050"&gt;1&lt;/span&gt;&lt;span style="color:#000000"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#888888"&gt;   59 &lt;/span&gt;&lt;br /&gt;&lt;span style="color:#888888"&gt;   60 &lt;/span&gt;        &lt;span style="color:#0000ff; font-weight:bold"&gt;if&lt;/span&gt;&lt;span style="color:#000000"&gt;(*&lt;/span&gt;references &lt;span style="color:#000000"&gt;==&lt;/span&gt; &lt;span style="color:#7e0050"&gt;0&lt;/span&gt;&lt;span style="color:#000000"&gt;){&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#888888"&gt;   61 &lt;/span&gt;            &lt;span style="color:#0000ff; font-weight:bold"&gt;delete&lt;/span&gt; type&lt;span style="color:#000000"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#888888"&gt;   62 &lt;/span&gt;            &lt;span style="color:#0000ff; font-weight:bold"&gt;delete&lt;/span&gt; references&lt;span style="color:#000000"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#888888"&gt;   63 &lt;/span&gt;            cout &lt;span style="color:#000000"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span style="color:#82604a"&gt;&amp;quot;Object destroyed...&amp;quot;&lt;/span&gt; &lt;span style="color:#000000"&gt;&amp;lt;&amp;lt;&lt;/span&gt; endl&lt;span style="color:#000000"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#888888"&gt;   64 &lt;/span&gt;        &lt;span style="color:#000000"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#888888"&gt;   65 &lt;/span&gt;    &lt;span style="color:#000000"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#888888"&gt;   66 &lt;/span&gt;&lt;br /&gt;&lt;span style="color:#888888"&gt;   67 &lt;/span&gt;    &lt;span style="color:#6b6b6b; font-style:italic"&gt;// &amp;quot;Dereferenzierung&amp;quot; Zugriff auf das Objekt.&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#888888"&gt;   68 &lt;/span&gt;    T&lt;span style="color:#000000"&gt;*&lt;/span&gt; &lt;span style="color:#740023"&gt;operator&lt;/span&gt;&lt;span style="color:#000000"&gt;-&amp;gt;()&lt;/span&gt;&lt;span style="color:#0000ff"&gt;const&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#888888"&gt;   69 &lt;/span&gt;    &lt;span style="color:#000000"&gt;{&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#888888"&gt;   70 &lt;/span&gt;        &lt;span style="color:#0000ff; font-weight:bold"&gt;return&lt;/span&gt; type&lt;span style="color:#000000"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#888888"&gt;   71 &lt;/span&gt;    &lt;span style="color:#000000"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#888888"&gt;   72 &lt;/span&gt;&lt;br /&gt;&lt;span style="color:#888888"&gt;   73 &lt;/span&gt;    &lt;span style="color:#0000ff"&gt;void&lt;/span&gt; &lt;span style="color:#000000; font-weight:bold"&gt;what&lt;/span&gt;&lt;span style="color:#000000"&gt;()&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#888888"&gt;   74 &lt;/span&gt;    &lt;span style="color:#000000"&gt;{&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#888888"&gt;   75 &lt;/span&gt;        cout &lt;span style="color:#000000"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span style="color:#82604a"&gt;&amp;quot;Mein Name ist: &amp;quot;&lt;/span&gt; &lt;span style="color:#000000"&gt;&amp;lt;&amp;lt;&lt;/span&gt; type&lt;span style="color:#000000"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color:#000000; font-weight:bold"&gt;getString&lt;/span&gt;&lt;span style="color:#000000"&gt;() &amp;lt;&amp;lt;&lt;/span&gt; endl&lt;span style="color:#000000"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#888888"&gt;   76 &lt;/span&gt;        cout &lt;span style="color:#000000"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span style="color:#82604a"&gt;&amp;quot; Referenzen: &amp;quot;&lt;/span&gt; &lt;span style="color:#000000"&gt;&amp;lt;&amp;lt; *&lt;/span&gt;references &lt;span style="color:#000000"&gt;&amp;lt;&amp;lt;&lt;/span&gt; endl&lt;span style="color:#000000"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#888888"&gt;   77 &lt;/span&gt;    &lt;span style="color:#000000"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#888888"&gt;   78 &lt;/span&gt;&lt;span style="color:#740023"&gt;private&lt;/span&gt;&lt;span style="color:#000000"&gt;:&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#888888"&gt;   79 &lt;/span&gt;    T&lt;span style="color:#000000"&gt;*&lt;/span&gt; type&lt;span style="color:#000000"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#888888"&gt;   80 &lt;/span&gt;    &lt;span style="color:#0000ff"&gt;int&lt;/span&gt;&lt;span style="color:#000000"&gt;*&lt;/span&gt; references&lt;span style="color:#000000"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#888888"&gt;   81 &lt;/span&gt;&lt;br /&gt;&lt;span style="color:#888888"&gt;   82 &lt;/span&gt;    &lt;span style="color:#6b6b6b; font-style:italic"&gt;// Kopierkonstruktor ist privat um diese Möglichkeit auszuschliessen.&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#888888"&gt;   83 &lt;/span&gt;    &lt;span style="color:#000000; font-weight:bold"&gt;SmartPtr&lt;/span&gt;&lt;span style="color:#000000"&gt;(&lt;/span&gt;SmartPtr &lt;span style="color:#0000ff"&gt;const&lt;/span&gt;&lt;span style="color:#000000"&gt;&amp;amp;&lt;/span&gt; r&lt;span style="color:#000000"&gt;);&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#888888"&gt;   84 &lt;/span&gt;&lt;span style="color:#000000"&gt;};&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#888888"&gt;   85 &lt;/span&gt;&lt;br /&gt;&lt;span style="color:#888888"&gt;   86 &lt;/span&gt;&lt;span style="color:#6b6b6b; font-style:italic"&gt;/****************************************************&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#888888"&gt;   87 &lt;/span&gt;&lt;span style="color:#6b6b6b; font-style:italic"&gt;* Testfunktion&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#888888"&gt;   88 &lt;/span&gt;&lt;span style="color:#6b6b6b; font-style:italic"&gt;*&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#888888"&gt;   89 &lt;/span&gt;&lt;span style="color:#6b6b6b; font-style:italic"&gt;* - SmartPtr - Test&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#888888"&gt;   90 &lt;/span&gt;&lt;span style="color:#6b6b6b; font-style:italic"&gt;* - Normale Zuweisung&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#888888"&gt;   91 &lt;/span&gt;&lt;span style="color:#6b6b6b; font-style:italic"&gt;* - Referenzzählung&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#888888"&gt;   92 &lt;/span&gt;&lt;span style="color:#6b6b6b; font-style:italic"&gt;* - Selbstzuweisung&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#888888"&gt;   93 &lt;/span&gt;&lt;span style="color:#6b6b6b; font-style:italic"&gt;* - Objektzerstörung&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#888888"&gt;   94 &lt;/span&gt;&lt;span style="color:#6b6b6b; font-style:italic"&gt;****************************************************/&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#888888"&gt;   95 &lt;/span&gt;&lt;span style="color:#0000ff"&gt;int&lt;/span&gt; &lt;span style="color:#000000; font-weight:bold"&gt;main&lt;/span&gt;&lt;span style="color:#000000"&gt;(&lt;/span&gt;&lt;span style="color:#0000ff"&gt;int&lt;/span&gt; argc&lt;span style="color:#000000"&gt;,&lt;/span&gt; &lt;span style="color:#0000ff"&gt;char&lt;/span&gt; &lt;span style="color:#000000"&gt;*&lt;/span&gt;argv&lt;span style="color:#000000"&gt;[])&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#888888"&gt;   96 &lt;/span&gt;&lt;span style="color:#000000"&gt;{&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#888888"&gt;   97 &lt;/span&gt;    &lt;span style="color:#000000"&gt;{&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#888888"&gt;   98 &lt;/span&gt;        &lt;span style="color:#6b6b6b; font-style:italic"&gt;// Neue Person erstellen und in einem SmartPtr festhalten.&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#888888"&gt;   99 &lt;/span&gt;        cout &lt;span style="color:#000000"&gt;&amp;lt;&amp;lt;&lt;/span&gt; endl &lt;span style="color:#000000"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span style="color:#82604a"&gt;&amp;quot;Neue Person.&amp;quot;&lt;/span&gt; &lt;span style="color:#000000"&gt;&amp;lt;&amp;lt;&lt;/span&gt; endl &lt;span style="color:#000000"&gt;&amp;lt;&amp;lt;&lt;/span&gt; endl&lt;span style="color:#000000"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#888888"&gt;  100 &lt;/span&gt;        SmartPtr &lt;span style="color:#000000; font-weight:bold"&gt;p1&lt;/span&gt;&lt;span style="color:#000000"&gt;(&lt;/span&gt;&lt;span style="color:#0000ff; font-weight:bold"&gt;new&lt;/span&gt; &lt;span style="color:#000000; font-weight:bold"&gt;Person&lt;/span&gt;&lt;span style="color:#000000"&gt;(&lt;/span&gt;&lt;span style="color:#82604a"&gt;&amp;quot;Hans Muster&amp;quot;&lt;/span&gt;&lt;span style="color:#000000"&gt;));&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#888888"&gt;  101 &lt;/span&gt;        cout &lt;span style="color:#000000"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span style="color:#82604a"&gt;&amp;quot;p1. &amp;quot;&lt;/span&gt;&lt;span style="color:#000000"&gt;;&lt;/span&gt; p1&lt;span style="color:#000000"&gt;.&lt;/span&gt;&lt;span style="color:#000000; font-weight:bold"&gt;what&lt;/span&gt;&lt;span style="color:#000000"&gt;();&lt;/span&gt; cout &lt;span style="color:#000000"&gt;&amp;lt;&amp;lt;&lt;/span&gt; endl&lt;span style="color:#000000"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#888888"&gt;  102 &lt;/span&gt;        cout &lt;span style="color:#000000"&gt;&amp;lt;&amp;lt;&lt;/span&gt; endl&lt;span style="color:#000000"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#888888"&gt;  103 &lt;/span&gt;&lt;br /&gt;&lt;span style="color:#888888"&gt;  104 &lt;/span&gt;        &lt;span style="color:#000000"&gt;{&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#888888"&gt;  105 &lt;/span&gt;            &lt;span style="color:#6b6b6b; font-style:italic"&gt;// Weiterer SmartPtr deklarieren&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#888888"&gt;  106 &lt;/span&gt;            SmartPtr p2&lt;span style="color:#000000"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#888888"&gt;  107 &lt;/span&gt;            &lt;span style="color:#6b6b6b; font-style:italic"&gt;// Zuweisung =&amp;gt; gemeinsame Nutzung von Person&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#888888"&gt;  108 &lt;/span&gt;            p2 &lt;span style="color:#000000"&gt;=&lt;/span&gt; p1&lt;span style="color:#000000"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#888888"&gt;  109 &lt;/span&gt;            &lt;span style="color:#6b6b6b; font-style:italic"&gt;// Name der Person ändern über p2&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#888888"&gt;  110 &lt;/span&gt;            p2&lt;span style="color:#000000"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color:#000000; font-weight:bold"&gt;setName&lt;/span&gt;&lt;span style="color:#000000"&gt;(&lt;/span&gt;&lt;span style="color:#82604a"&gt;&amp;quot;Muster Hans&amp;quot;&lt;/span&gt;&lt;span style="color:#000000"&gt;);&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#888888"&gt;  111 &lt;/span&gt;&lt;br /&gt;&lt;span style="color:#888888"&gt;  112 &lt;/span&gt;            cout &lt;span style="color:#000000"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span style="color:#82604a"&gt;&amp;quot;Geaenderte Person ueber p2&amp;quot;&lt;/span&gt; &lt;span style="color:#000000"&gt;&amp;lt;&amp;lt;&lt;/span&gt; endl &lt;span style="color:#000000"&gt;&amp;lt;&amp;lt;&lt;/span&gt; endl&lt;span style="color:#000000"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#888888"&gt;  113 &lt;/span&gt;            cout &lt;span style="color:#000000"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span style="color:#82604a"&gt;&amp;quot;p1. &amp;quot;&lt;/span&gt;&lt;span style="color:#000000"&gt;;&lt;/span&gt; p1&lt;span style="color:#000000"&gt;.&lt;/span&gt;&lt;span style="color:#000000; font-weight:bold"&gt;what&lt;/span&gt;&lt;span style="color:#000000"&gt;();&lt;/span&gt; cout &lt;span style="color:#000000"&gt;&amp;lt;&amp;lt;&lt;/span&gt; endl&lt;span style="color:#000000"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#888888"&gt;  114 &lt;/span&gt;            cout &lt;span style="color:#000000"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span style="color:#82604a"&gt;&amp;quot;p2. &amp;quot;&lt;/span&gt;&lt;span style="color:#000000"&gt;;&lt;/span&gt; p2&lt;span style="color:#000000"&gt;.&lt;/span&gt;&lt;span style="color:#000000; font-weight:bold"&gt;what&lt;/span&gt;&lt;span style="color:#000000"&gt;();&lt;/span&gt; cout &lt;span style="color:#000000"&gt;&amp;lt;&amp;lt;&lt;/span&gt; endl&lt;span style="color:#000000"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#888888"&gt;  115 &lt;/span&gt;        &lt;span style="color:#000000"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#888888"&gt;  116 &lt;/span&gt;&lt;br /&gt;&lt;span style="color:#888888"&gt;  117 &lt;/span&gt;        cout &lt;span style="color:#000000"&gt;&amp;lt;&amp;lt;&lt;/span&gt; endl&lt;span style="color:#000000"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#888888"&gt;  118 &lt;/span&gt;        cout &lt;span style="color:#000000"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span style="color:#82604a"&gt;&amp;quot;p2 ist ausserhalb des Sichtbarkeitsbereiches.&amp;quot;&lt;/span&gt; &lt;span style="color:#000000"&gt;&amp;lt;&amp;lt;&lt;/span&gt; endl &lt;span style="color:#000000"&gt;&amp;lt;&amp;lt;&lt;/span&gt; endl&lt;span style="color:#000000"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#888888"&gt;  119 &lt;/span&gt;        cout &lt;span style="color:#000000"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span style="color:#82604a"&gt;&amp;quot;p1. &amp;quot;&lt;/span&gt;&lt;span style="color:#000000"&gt;;&lt;/span&gt; p1&lt;span style="color:#000000"&gt;.&lt;/span&gt;&lt;span style="color:#000000; font-weight:bold"&gt;what&lt;/span&gt;&lt;span style="color:#000000"&gt;();&lt;/span&gt; cout &lt;span style="color:#000000"&gt;&amp;lt;&amp;lt;&lt;/span&gt; endl &lt;span style="color:#000000"&gt;&amp;lt;&amp;lt;&lt;/span&gt; endl&lt;span style="color:#000000"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#888888"&gt;  120 &lt;/span&gt;&lt;br /&gt;&lt;span style="color:#888888"&gt;  121 &lt;/span&gt;        p1 &lt;span style="color:#000000"&gt;=&lt;/span&gt; p1&lt;span style="color:#000000"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#888888"&gt;  122 &lt;/span&gt;        cout &lt;span style="color:#000000"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span style="color:#82604a"&gt;&amp;quot;Selbstzuweisung von p1.&amp;quot;&lt;/span&gt; &lt;span style="color:#000000"&gt;&amp;lt;&amp;lt;&lt;/span&gt; endl &lt;span style="color:#000000"&gt;&amp;lt;&amp;lt;&lt;/span&gt; endl&lt;span style="color:#000000"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#888888"&gt;  123 &lt;/span&gt;        cout &lt;span style="color:#000000"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span style="color:#82604a"&gt;&amp;quot;p1. &amp;quot;&lt;/span&gt;&lt;span style="color:#000000"&gt;;&lt;/span&gt; p1&lt;span style="color:#000000"&gt;.&lt;/span&gt;&lt;span style="color:#000000; font-weight:bold"&gt;what&lt;/span&gt;&lt;span style="color:#000000"&gt;();&lt;/span&gt; cout &lt;span style="color:#000000"&gt;&amp;lt;&amp;lt;&lt;/span&gt; endl&lt;span style="color:#000000"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#888888"&gt;  124 &lt;/span&gt;    &lt;span style="color:#000000"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#888888"&gt;  125 &lt;/span&gt;&lt;br /&gt;&lt;span style="color:#888888"&gt;  126 &lt;/span&gt;    &lt;span style="color:#000000; font-weight:bold"&gt;system&lt;/span&gt;&lt;span style="color:#000000"&gt;(&lt;/span&gt;&lt;span style="color:#82604a"&gt;&amp;quot;PAUSE&amp;quot;&lt;/span&gt;&lt;span style="color:#000000"&gt;);&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#888888"&gt;  127 &lt;/span&gt;    &lt;span style="color:#0000ff; font-weight:bold"&gt;return&lt;/span&gt; EXIT_SUCCESS&lt;span style="color:#000000"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#888888"&gt;  128 &lt;/span&gt;&lt;span style="color:#000000"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_b8WdzBBgi5c/R1_7_2zZe1I/AAAAAAAAAB4/j-ZVHJ0V5NM/s1600-h/raii-objekte.PNG"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://2.bp.blogspot.com/_b8WdzBBgi5c/R1_7_2zZe1I/AAAAAAAAAB4/j-ZVHJ0V5NM/s400/raii-objekte.PNG" border="0" alt=""id="BLOGGER_PHOTO_ID_5143106373941820242" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p class="MsoNormal"&gt;&lt;b style="font-size:130%;"&gt;Beispiel 2&lt;/b&gt;&lt;br /&gt;Natürlich gibt es für intelligente Pointer bereits bewährte Bibliotheken. Ich empfehle den shared_ptr von Boost. Im folgenden Listing sehen sie wie dieser zu handhaben ist, wie zuvor mit der entsprechenden Ausgabe.&lt;br /&gt;&lt;pre style="color:#000000; background-color:#ffffff; font-size:10pt; font-family:Courier New;"&gt;&lt;span style="color:#888888"&gt;    1 &lt;/span&gt;&lt;span style="color:#0b810d"&gt;#include &amp;lt;cstdlib&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#888888"&gt;    2 &lt;/span&gt;&lt;span style="color:#0b810d"&gt;#include &amp;lt;iostream&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#888888"&gt;    3 &lt;/span&gt;&lt;span style="color:#0b810d"&gt;#include &amp;lt;string&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#888888"&gt;    4 &lt;/span&gt;&lt;span style="color:#0b810d"&gt;#include&lt;/span&gt; &lt;span style="color:#0b810d"&gt;&amp;quot;shared_ptr.hpp&amp;quot;&lt;/span&gt;&lt;span style="color:#0b810d"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#888888"&gt;    5 &lt;/span&gt;&lt;br /&gt;&lt;span style="color:#888888"&gt;    6 &lt;/span&gt;&lt;span style="color:#0000ff; font-weight:bold"&gt;using namespace&lt;/span&gt; std&lt;span style="color:#000000"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#888888"&gt;    7 &lt;/span&gt;&lt;span style="color:#0000ff; font-weight:bold"&gt;using namespace&lt;/span&gt; boost&lt;span style="color:#000000"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#888888"&gt;    8 &lt;/span&gt;&lt;br /&gt;&lt;span style="color:#888888"&gt;    9 &lt;/span&gt;&lt;span style="color:#740023"&gt;class&lt;/span&gt; Person&lt;br /&gt;&lt;span style="color:#888888"&gt;   10 &lt;/span&gt;&lt;span style="color:#000000"&gt;{&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#888888"&gt;   11 &lt;/span&gt;&lt;span style="color:#740023"&gt;public&lt;/span&gt;&lt;span style="color:#000000"&gt;:&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#888888"&gt;   12 &lt;/span&gt;    &lt;span style="color:#000000; font-weight:bold"&gt;Person&lt;/span&gt;&lt;span style="color:#000000"&gt;(&lt;/span&gt;string name&lt;span style="color:#000000"&gt;) :&lt;/span&gt; &lt;span style="color:#000000; font-weight:bold"&gt;name&lt;/span&gt;&lt;span style="color:#000000"&gt;(&lt;/span&gt;name&lt;span style="color:#000000"&gt;){}&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#888888"&gt;   13 &lt;/span&gt;&lt;br /&gt;&lt;span style="color:#888888"&gt;   14 &lt;/span&gt;    string &lt;span style="color:#000000; font-weight:bold"&gt;getName&lt;/span&gt;&lt;span style="color:#000000"&gt;()&lt;/span&gt;&lt;span style="color:#0000ff"&gt;const&lt;/span&gt; &lt;span style="color:#000000"&gt;{&lt;/span&gt;&lt;span style="color:#0000ff; font-weight:bold"&gt;return&lt;/span&gt; name&lt;span style="color:#000000"&gt;;}&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#888888"&gt;   15 &lt;/span&gt;    &lt;span style="color:#0000ff"&gt;void&lt;/span&gt; &lt;span style="color:#000000; font-weight:bold"&gt;setName&lt;/span&gt;&lt;span style="color:#000000"&gt;(&lt;/span&gt;string str&lt;span style="color:#000000"&gt;) {&lt;/span&gt;name &lt;span style="color:#000000"&gt;=&lt;/span&gt; str&lt;span style="color:#000000"&gt;;}&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#888888"&gt;   16 &lt;/span&gt;&lt;span style="color:#740023"&gt;private&lt;/span&gt;&lt;span style="color:#000000"&gt;:&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#888888"&gt;   17 &lt;/span&gt;    string name&lt;span style="color:#000000"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#888888"&gt;   18 &lt;/span&gt;&lt;span style="color:#000000"&gt;};&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#888888"&gt;   19 &lt;/span&gt;&lt;br /&gt;&lt;span style="color:#888888"&gt;   20 &lt;/span&gt;&lt;span style="color:#0000ff"&gt;void&lt;/span&gt; &lt;span style="color:#000000; font-weight:bold"&gt;what&lt;/span&gt;&lt;span style="color:#000000"&gt;(&lt;/span&gt;string name&lt;span style="color:#000000"&gt;,&lt;/span&gt; &lt;span style="color:#0000ff"&gt;long&lt;/span&gt; refs&lt;span style="color:#000000"&gt;);&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#888888"&gt;   21 &lt;/span&gt;&lt;br /&gt;&lt;span style="color:#888888"&gt;   22 &lt;/span&gt;&lt;span style="color:#0000ff"&gt;int&lt;/span&gt; &lt;span style="color:#000000; font-weight:bold"&gt;main&lt;/span&gt;&lt;span style="color:#000000"&gt;(&lt;/span&gt;&lt;span style="color:#0000ff"&gt;int&lt;/span&gt; argc&lt;span style="color:#000000"&gt;,&lt;/span&gt; &lt;span style="color:#0000ff"&gt;char&lt;/span&gt; &lt;span style="color:#000000"&gt;*&lt;/span&gt;argv&lt;span style="color:#000000"&gt;[])&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#888888"&gt;   23 &lt;/span&gt;&lt;span style="color:#000000"&gt;{&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#888888"&gt;   24 &lt;/span&gt;    &lt;span style="color:#6b6b6b; font-style:italic"&gt;// Neue Person erstellen und p1 übergeben&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#888888"&gt;   25 &lt;/span&gt;    cout &lt;span style="color:#000000"&gt;&amp;lt;&amp;lt;&lt;/span&gt; endl &lt;span style="color:#000000"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span style="color:#82604a"&gt;&amp;quot;Neue Person.&amp;quot;&lt;/span&gt; &lt;span style="color:#000000"&gt;&amp;lt;&amp;lt;&lt;/span&gt; endl &lt;span style="color:#000000"&gt;&amp;lt;&amp;lt;&lt;/span&gt; endl&lt;span style="color:#000000"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#888888"&gt;   26 &lt;/span&gt;    shared_ptr &lt;span style="color:#000000; font-weight:bold"&gt;p1&lt;/span&gt;&lt;span style="color:#000000"&gt;(&lt;/span&gt;&lt;span style="color:#0000ff; font-weight:bold"&gt;new&lt;/span&gt; &lt;span style="color:#000000; font-weight:bold"&gt;Person&lt;/span&gt;&lt;span style="color:#000000"&gt;(&lt;/span&gt;&lt;span style="color:#82604a"&gt;&amp;quot;Hans Muster&amp;quot;&lt;/span&gt;&lt;span style="color:#000000"&gt;));&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#888888"&gt;   27 &lt;/span&gt;    cout &lt;span style="color:#000000"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span style="color:#82604a"&gt;&amp;quot;p1.&amp;quot;&lt;/span&gt;&lt;span style="color:#000000"&gt;;&lt;/span&gt; &lt;span style="color:#000000; font-weight:bold"&gt;what&lt;/span&gt;&lt;span style="color:#000000"&gt;(&lt;/span&gt;p1&lt;span style="color:#000000"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color:#000000; font-weight:bold"&gt;getName&lt;/span&gt;&lt;span style="color:#000000"&gt;(),&lt;/span&gt; p1&lt;span style="color:#000000"&gt;.&lt;/span&gt;&lt;span style="color:#000000; font-weight:bold"&gt;use_count&lt;/span&gt;&lt;span style="color:#000000"&gt;());&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#888888"&gt;   28 &lt;/span&gt;    cout &lt;span style="color:#000000"&gt;&amp;lt;&amp;lt;&lt;/span&gt; endl&lt;span style="color:#000000"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#888888"&gt;   29 &lt;/span&gt;    &lt;span style="color:#000000"&gt;{&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#888888"&gt;   30 &lt;/span&gt;        &lt;span style="color:#6b6b6b; font-style:italic"&gt;// p2 initialisieren mit p1 (Kopierkonstruktor)&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#888888"&gt;   31 &lt;/span&gt;        shared_ptr &lt;span style="color:#000000; font-weight:bold"&gt;p2&lt;/span&gt;&lt;span style="color:#000000"&gt;(&lt;/span&gt;p1&lt;span style="color:#000000"&gt;);&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#888888"&gt;   32 &lt;/span&gt;        p2&lt;span style="color:#000000"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color:#000000; font-weight:bold"&gt;setName&lt;/span&gt;&lt;span style="color:#000000"&gt;(&lt;/span&gt;&lt;span style="color:#82604a"&gt;&amp;quot;Muster Hans&amp;quot;&lt;/span&gt;&lt;span style="color:#000000"&gt;);&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#888888"&gt;   33 &lt;/span&gt;        cout &lt;span style="color:#000000"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span style="color:#82604a"&gt;&amp;quot;Geaenderte Person ueber p2&amp;quot;&lt;/span&gt; &lt;span style="color:#000000"&gt;&amp;lt;&amp;lt;&lt;/span&gt; endl &lt;span style="color:#000000"&gt;&amp;lt;&amp;lt;&lt;/span&gt; endl&lt;span style="color:#000000"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#888888"&gt;   34 &lt;/span&gt;        cout &lt;span style="color:#000000"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span style="color:#82604a"&gt;&amp;quot;p1.&amp;quot;&lt;/span&gt;&lt;span style="color:#000000"&gt;;&lt;/span&gt; &lt;span style="color:#000000; font-weight:bold"&gt;what&lt;/span&gt;&lt;span style="color:#000000"&gt;(&lt;/span&gt;p1&lt;span style="color:#000000"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color:#000000; font-weight:bold"&gt;getName&lt;/span&gt;&lt;span style="color:#000000"&gt;(),&lt;/span&gt; p1&lt;span style="color:#000000"&gt;.&lt;/span&gt;&lt;span style="color:#000000; font-weight:bold"&gt;use_count&lt;/span&gt;&lt;span style="color:#000000"&gt;());&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#888888"&gt;   35 &lt;/span&gt;        cout &lt;span style="color:#000000"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span style="color:#82604a"&gt;&amp;quot;p2.&amp;quot;&lt;/span&gt;&lt;span style="color:#000000"&gt;;&lt;/span&gt; &lt;span style="color:#000000; font-weight:bold"&gt;what&lt;/span&gt;&lt;span style="color:#000000"&gt;(&lt;/span&gt;p2&lt;span style="color:#000000"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color:#000000; font-weight:bold"&gt;getName&lt;/span&gt;&lt;span style="color:#000000"&gt;(),&lt;/span&gt; p2&lt;span style="color:#000000"&gt;.&lt;/span&gt;&lt;span style="color:#000000; font-weight:bold"&gt;use_count&lt;/span&gt;&lt;span style="color:#000000"&gt;());&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#888888"&gt;   36 &lt;/span&gt;    &lt;span style="color:#000000"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#888888"&gt;   37 &lt;/span&gt;    cout &lt;span style="color:#000000"&gt;&amp;lt;&amp;lt;&lt;/span&gt; endl&lt;span style="color:#000000"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#888888"&gt;   38 &lt;/span&gt;    cout &lt;span style="color:#000000"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span style="color:#82604a"&gt;&amp;quot;p2 ist ausserhalb des Sichtbarkeitsbereiches.&amp;quot;&lt;/span&gt; &lt;span style="color:#000000"&gt;&amp;lt;&amp;lt;&lt;/span&gt; endl &lt;span style="color:#000000"&gt;&amp;lt;&amp;lt;&lt;/span&gt; endl&lt;span style="color:#000000"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#888888"&gt;   39 &lt;/span&gt;&lt;br /&gt;&lt;span style="color:#888888"&gt;   40 &lt;/span&gt;    p1 &lt;span style="color:#000000"&gt;=&lt;/span&gt; p1&lt;span style="color:#000000"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#888888"&gt;   41 &lt;/span&gt;    cout &lt;span style="color:#000000"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span style="color:#82604a"&gt;&amp;quot;Selbstzuweisung von p1.&amp;quot;&lt;/span&gt; &lt;span style="color:#000000"&gt;&amp;lt;&amp;lt;&lt;/span&gt; endl &lt;span style="color:#000000"&gt;&amp;lt;&amp;lt;&lt;/span&gt; endl&lt;span style="color:#000000"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#888888"&gt;   42 &lt;/span&gt;    cout &lt;span style="color:#000000"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span style="color:#82604a"&gt;&amp;quot;p1.&amp;quot;&lt;/span&gt;&lt;span style="color:#000000"&gt;;&lt;/span&gt; &lt;span style="color:#000000; font-weight:bold"&gt;what&lt;/span&gt;&lt;span style="color:#000000"&gt;(&lt;/span&gt;p1&lt;span style="color:#000000"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color:#000000; font-weight:bold"&gt;getName&lt;/span&gt;&lt;span style="color:#000000"&gt;(),&lt;/span&gt; p1&lt;span style="color:#000000"&gt;.&lt;/span&gt;&lt;span style="color:#000000; font-weight:bold"&gt;use_count&lt;/span&gt;&lt;span style="color:#000000"&gt;());&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#888888"&gt;   43 &lt;/span&gt;&lt;br /&gt;&lt;span style="color:#888888"&gt;   44 &lt;/span&gt;    &lt;span style="color:#000000; font-weight:bold"&gt;system&lt;/span&gt;&lt;span style="color:#000000"&gt;(&lt;/span&gt;&lt;span style="color:#82604a"&gt;&amp;quot;PAUSE&amp;quot;&lt;/span&gt;&lt;span style="color:#000000"&gt;);&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#888888"&gt;   45 &lt;/span&gt;    &lt;span style="color:#0000ff; font-weight:bold"&gt;return&lt;/span&gt; EXIT_SUCCESS&lt;span style="color:#000000"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#888888"&gt;   46 &lt;/span&gt;&lt;span style="color:#000000"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#888888"&gt;   47 &lt;/span&gt;&lt;br /&gt;&lt;span style="color:#888888"&gt;   48 &lt;/span&gt;&lt;span style="color:#0000ff"&gt;void&lt;/span&gt; &lt;span style="color:#000000; font-weight:bold"&gt;what&lt;/span&gt;&lt;span style="color:#000000"&gt;(&lt;/span&gt;string name&lt;span style="color:#000000"&gt;,&lt;/span&gt; &lt;span style="color:#0000ff"&gt;long&lt;/span&gt; refs&lt;span style="color:#000000"&gt;)&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#888888"&gt;   49 &lt;/span&gt;&lt;span style="color:#000000"&gt;{&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#888888"&gt;   50 &lt;/span&gt;    cout &lt;span style="color:#000000"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span style="color:#82604a"&gt;&amp;quot; Mein Name ist: &amp;quot;&lt;/span&gt; &lt;span style="color:#000000"&gt;&amp;lt;&amp;lt;&lt;/span&gt; name &lt;span style="color:#000000"&gt;&amp;lt;&amp;lt;&lt;/span&gt; endl&lt;span style="color:#000000"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#888888"&gt;   51 &lt;/span&gt;    cout &lt;span style="color:#000000"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span style="color:#82604a"&gt;&amp;quot; Referenzen: &amp;quot;&lt;/span&gt; &lt;span style="color:#000000"&gt;&amp;lt;&amp;lt;&lt;/span&gt; refs &lt;span style="color:#000000"&gt;&amp;lt;&amp;lt;&lt;/span&gt; endl&lt;span style="color:#000000"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#888888"&gt;   52 &lt;/span&gt;&lt;span style="color:#000000"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_b8WdzBBgi5c/R1_8IGzZe2I/AAAAAAAAACA/LnifsKXnAZQ/s1600-h/raii-objekte2.PNG"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://3.bp.blogspot.com/_b8WdzBBgi5c/R1_8IGzZe2I/AAAAAAAAACA/LnifsKXnAZQ/s400/raii-objekte2.PNG" border="0" alt=""id="BLOGGER_PHOTO_ID_5143106515675741026" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1312036047635172421-1197417499087355159?l=aboutinformationtechnologies.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://aboutinformationtechnologies.blogspot.com/feeds/1197417499087355159/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1312036047635172421&amp;postID=1197417499087355159' title='0 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1312036047635172421/posts/default/1197417499087355159'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1312036047635172421/posts/default/1197417499087355159'/><link rel='alternate' type='text/html' href='http://aboutinformationtechnologies.blogspot.com/2007/12/objekte-als-ressourcenverwaltung.html' title='Objekte als Ressourcenverwaltung'/><author><name>Christoph Jud</name><uri>http://www.blogger.com/profile/12319992956473639407</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_b8WdzBBgi5c/R1_7_2zZe1I/AAAAAAAAAB4/j-ZVHJ0V5NM/s72-c/raii-objekte.PNG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1312036047635172421.post-9203822179863600796</id><published>2007-12-05T17:17:00.001+01:00</published><updated>2008-01-04T11:58:48.169+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Linux - Kernel Programmierung'/><title type='text'>Versenden eines Ethernet - Frames mit richtiger Frame Check Sequence</title><content type='html'>&lt;b style=""&gt;Problem&lt;o:p&gt;&lt;/o:p&gt;&lt;/b&gt;&lt;br /&gt;Als ich in einer Projektarbeit einen „Rapid Spanning Tree“ - Treiber für die Linux – Bridge implementierte hatte ich Probleme ein Ethernet – Frame korrekt nach Standard zu versenden. Da im Internet und in Büchern nur spärlich Informationen hierzu vorhanden sind werde ich zwei wichtige Erkenntnisse in diesem Post besonders hervorheben; Die Länge eines Ethernet – Frames und das korrekte Erstellen einer Frame Check Sequence (FCS).                 &lt;br /&gt;&lt;p class="MsoNormal"&gt;&lt;b style=""&gt;Länge&lt;o:p&gt;&lt;/o:p&gt;&lt;/b&gt;&lt;br /&gt;Im IEEE 802.3 Standard ist definiert, dass ein Frame mindestens 64 Byte gross sein muss. Ist das zu versendende Packet nun kürzer, muss der Rest mindestens bis auf 64 Byte gepaddet werden. In meiner Variante wird einfach herumliegender Speicher gelesen, was einwenig unschön ist. Ich gebe es ja zu. ;)&lt;br /&gt;&lt;listing&gt;&lt;br /&gt;   // Length of a Frame&lt;br /&gt;   size = length + 2*ETH_ALEN + 2 + 4; // + 4 wegen CRC-32&lt;br /&gt;   if (size &lt; 64) size = 64;           // Ethernet Standard min 64 Byte&lt;br /&gt;&lt;/listing&gt;&lt;br /&gt;Im Sourcefile &lt;span style="font-size: 85%; font-family: Courier New"&gt;br_stp_bpdu.c&lt;/span&gt; Version 1.3 des 2.6er Kernels ist dies nicht korrekt implementiert.&lt;/p&gt;&lt;br /&gt;&lt;p class="MsoNormal"&gt;&lt;b style=""&gt;Frame Check Sequence&lt;o:p&gt;&lt;/o:p&gt;&lt;/b&gt;&lt;br /&gt;Über die Art und Weise wie und über welche Teile eines Ethernet – Frames eine FCS tatsächlich generiert werden muss ist es schwierig Informationen zu erhalten. Meine Lösung überprüfte ich mit dem Programm Wireshark Version 0.99.5. Und zwar wird die FCS über den gesamten Datenbereich des &lt;span style="font-size: 85%;font-family: Courier New"&gt;sk_buff&lt;/span&gt; berechnet, natürlich exklusive der CRC.&lt;br /&gt;&lt;listing&gt;&lt;br /&gt;   // IEEE 802.3 CRC-32 (ganzes Ethernet-Packet ohne die CRC selbst)&lt;br /&gt;   fcs = ~(crc32_le(~0, skb-&gt;data, skb-&gt;len - 4));&lt;br /&gt;&lt;/listing&gt;&lt;br /&gt;In der besagten Version der Linux – Bridge wird keine FCS angehängt.&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;p class="MsoNormal"&gt;&lt;b style=""&gt;&lt;span style="" lang="EN-GB"&gt;Sourcecode der gesamten Funktion&lt;/span&gt;&lt;/b&gt;&lt;span style=""&gt;&lt;/span&gt;&lt;br /&gt;Hier noch das Listing der gesamten Funktion, damit der Leser an einem konkreten Beispiel sehen kann, wie ein Ethernet – Frame verschickt werden kann. &lt;/p&gt;    &lt;p class="MsoNormal"&gt;&lt;o:p&gt;&lt;/o:p&gt;In dem „Rapid Spanning Tree Protocol“ (RSTP) werden zur Kommunikation zwischen den Bridges sogenannte „Bridge Protocol Data Units“ (BPDU) verschickt. In dieser Funktion wird ein BPDU in ein Ethernet – Frame gepackt. Der Funktion wird das entsprechende Portdevice, das Datenfeld und die Länge des Datenfeldes übergeben. Mit dem &lt;span style="font-size: 85%;font-family: Courier New"&gt;NF_HOOK&lt;/span&gt; – Makro übergibt man das fertige Frame dem Kernel.&lt;br /&gt;&lt;pre style="color:#000000; background-color:#ffffff; font-size:10pt; font-family:Courier New;"&gt;&lt;span style="color:#0000ff"&gt;static void&lt;/span&gt; &lt;span style="color:#000000; font-weight:bold"&gt;br_send_bpdu&lt;/span&gt;&lt;span style="color:#000000"&gt;(&lt;/span&gt;&lt;span style="color:#0000ff"&gt;struct&lt;/span&gt; net_bridge_port &lt;span style="color:#000000"&gt;*&lt;/span&gt;p&lt;span style="color:#000000"&gt;,&lt;/span&gt; &lt;span style="color:#0000ff"&gt;unsigned char&lt;/span&gt; &lt;span style="color:#000000"&gt;*&lt;/span&gt;data&lt;span style="color:#000000"&gt;,&lt;/span&gt; &lt;span style="color:#0000ff"&gt;int&lt;/span&gt; length&lt;span style="color:#000000"&gt;)&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#000000"&gt;{&lt;/span&gt;&lt;br /&gt;    &lt;span style="color:#0000ff"&gt;struct&lt;/span&gt; net_device &lt;span style="color:#000000"&gt;*&lt;/span&gt;dev&lt;span style="color:#000000"&gt;;&lt;/span&gt;&lt;br /&gt;    &lt;span style="color:#0000ff"&gt;struct&lt;/span&gt; sk_buff &lt;span style="color:#000000"&gt;*&lt;/span&gt;skb&lt;span style="color:#000000"&gt;;&lt;/span&gt;&lt;br /&gt;    &lt;span style="color:#0000ff"&gt;int&lt;/span&gt; size&lt;span style="color:#000000"&gt;;&lt;/span&gt;&lt;br /&gt;    u32 fcs&lt;span style="color:#000000"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;    &lt;span style="color:#0000ff; font-weight:bold"&gt;if&lt;/span&gt; &lt;span style="color:#000000"&gt;(!&lt;/span&gt;p&lt;span style="color:#000000"&gt;-&amp;gt;&lt;/span&gt;br&lt;span style="color:#000000"&gt;-&amp;gt;&lt;/span&gt;stp_enabled&lt;span style="color:#000000"&gt;)&lt;/span&gt;&lt;br /&gt;        &lt;span style="color:#0000ff; font-weight:bold"&gt;return&lt;/span&gt;&lt;span style="color:#000000"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;    &lt;span style="color:#6b6b6b; font-style:italic"&gt;// Length of a Frame&lt;/span&gt;&lt;br /&gt;    size &lt;span style="color:#000000"&gt;=&lt;/span&gt; length &lt;span style="color:#000000"&gt;+&lt;/span&gt; &lt;span style="color:#7e0050"&gt;2&lt;/span&gt;&lt;span style="color:#000000"&gt;*&lt;/span&gt;ETH_ALEN &lt;span style="color:#000000"&gt;+&lt;/span&gt; &lt;span style="color:#7e0050"&gt;2&lt;/span&gt; &lt;span style="color:#000000"&gt;+&lt;/span&gt; &lt;span style="color:#7e0050"&gt;4&lt;/span&gt;&lt;span style="color:#000000"&gt;;&lt;/span&gt; &lt;span style="color:#6b6b6b; font-style:italic"&gt;// + 4 wegen CRC-32&lt;/span&gt;&lt;br /&gt;    &lt;span style="color:#0000ff; font-weight:bold"&gt;if&lt;/span&gt; &lt;span style="color:#000000"&gt;(&lt;/span&gt;size &lt;span style="color:#000000"&gt;&amp;lt;&lt;/span&gt; &lt;span style="color:#7e0050"&gt;64&lt;/span&gt;&lt;span style="color:#000000"&gt;)&lt;/span&gt; size &lt;span style="color:#000000"&gt;=&lt;/span&gt; &lt;span style="color:#7e0050"&gt;64&lt;/span&gt;&lt;span style="color:#000000"&gt;;&lt;/span&gt; &lt;span style="color:#6b6b6b; font-style:italic"&gt;// Ethernet Standard min 64 Byte&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;    dev &lt;span style="color:#000000"&gt;=&lt;/span&gt; p&lt;span style="color:#000000"&gt;-&amp;gt;&lt;/span&gt;dev&lt;span style="color:#000000"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;    &lt;span style="color:#0000ff; font-weight:bold"&gt;if&lt;/span&gt; &lt;span style="color:#000000"&gt;((&lt;/span&gt;skb &lt;span style="color:#000000"&gt;=&lt;/span&gt; &lt;span style="color:#000000; font-weight:bold"&gt;dev_alloc_skb&lt;/span&gt;&lt;span style="color:#000000"&gt;(&lt;/span&gt;size&lt;span style="color:#000000"&gt;)) ==&lt;/span&gt; NULL&lt;span style="color:#000000"&gt;) {&lt;/span&gt;&lt;br /&gt;        &lt;span style="color:#000000; font-weight:bold"&gt;printk&lt;/span&gt;&lt;span style="color:#000000"&gt;(&lt;/span&gt;KERN_INFO &lt;span style="color:#82604a"&gt;&amp;quot;br: memory squeeze!&lt;/span&gt;&lt;span style="color:#82604a"&gt;\n&lt;/span&gt;&lt;span style="color:#82604a"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000"&gt;);&lt;/span&gt;&lt;br /&gt;        &lt;span style="color:#0000ff; font-weight:bold"&gt;return&lt;/span&gt;&lt;span style="color:#000000"&gt;;&lt;/span&gt;&lt;br /&gt;    &lt;span style="color:#000000"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;    skb&lt;span style="color:#000000"&gt;-&amp;gt;&lt;/span&gt;dev &lt;span style="color:#000000"&gt;=&lt;/span&gt; dev&lt;span style="color:#000000"&gt;;&lt;/span&gt;&lt;br /&gt;    skb&lt;span style="color:#000000"&gt;-&amp;gt;&lt;/span&gt;protocol &lt;span style="color:#000000"&gt;=&lt;/span&gt; &lt;span style="color:#000000; font-weight:bold"&gt;htons&lt;/span&gt;&lt;span style="color:#000000"&gt;(&lt;/span&gt;ETH_P_802_2&lt;span style="color:#000000"&gt;);&lt;/span&gt;&lt;br /&gt;    skb&lt;span style="color:#000000"&gt;-&amp;gt;&lt;/span&gt;mac&lt;span style="color:#000000"&gt;.&lt;/span&gt;raw &lt;span style="color:#000000"&gt;=&lt;/span&gt; &lt;span style="color:#000000; font-weight:bold"&gt;skb_put&lt;/span&gt;&lt;span style="color:#000000"&gt;(&lt;/span&gt;skb&lt;span style="color:#000000"&gt;,&lt;/span&gt; size&lt;span style="color:#000000"&gt;);&lt;/span&gt;&lt;br /&gt;    &lt;span style="color:#000000; font-weight:bold"&gt;memcpy&lt;/span&gt;&lt;span style="color:#000000"&gt;(&lt;/span&gt;skb&lt;span style="color:#000000"&gt;-&amp;gt;&lt;/span&gt;mac&lt;span style="color:#000000"&gt;.&lt;/span&gt;raw&lt;span style="color:#000000"&gt;,&lt;/span&gt; bridge_ula&lt;span style="color:#000000"&gt;,&lt;/span&gt; ETH_ALEN&lt;span style="color:#000000"&gt;);&lt;/span&gt;&lt;br /&gt;    &lt;span style="color:#000000; font-weight:bold"&gt;memcpy&lt;/span&gt;&lt;span style="color:#000000"&gt;(&lt;/span&gt;skb&lt;span style="color:#000000"&gt;-&amp;gt;&lt;/span&gt;mac&lt;span style="color:#000000"&gt;.&lt;/span&gt;raw&lt;span style="color:#000000"&gt;+&lt;/span&gt;ETH_ALEN&lt;span style="color:#000000"&gt;,&lt;/span&gt; dev&lt;span style="color:#000000"&gt;-&amp;gt;&lt;/span&gt;dev_addr&lt;span style="color:#000000"&gt;,&lt;/span&gt; ETH_ALEN&lt;span style="color:#000000"&gt;);&lt;/span&gt;&lt;br /&gt;    skb&lt;span style="color:#000000"&gt;-&amp;gt;&lt;/span&gt;mac&lt;span style="color:#000000"&gt;.&lt;/span&gt;raw&lt;span style="color:#000000"&gt;[&lt;/span&gt;&lt;span style="color:#7e0050"&gt;2&lt;/span&gt;&lt;span style="color:#000000"&gt;*&lt;/span&gt;ETH_ALEN&lt;span style="color:#000000"&gt;] =&lt;/span&gt; &lt;span style="color:#7e0050"&gt;0&lt;/span&gt;&lt;span style="color:#000000"&gt;;&lt;/span&gt;&lt;br /&gt;    skb&lt;span style="color:#000000"&gt;-&amp;gt;&lt;/span&gt;mac&lt;span style="color:#000000"&gt;.&lt;/span&gt;raw&lt;span style="color:#000000"&gt;[&lt;/span&gt;&lt;span style="color:#7e0050"&gt;2&lt;/span&gt;&lt;span style="color:#000000"&gt;*&lt;/span&gt;ETH_ALEN&lt;span style="color:#000000"&gt;+&lt;/span&gt;&lt;span style="color:#7e0050"&gt;1&lt;/span&gt;&lt;span style="color:#000000"&gt;] =&lt;/span&gt; length&lt;span style="color:#000000"&gt;;&lt;/span&gt;&lt;br /&gt;    skb&lt;span style="color:#000000"&gt;-&amp;gt;&lt;/span&gt;nh&lt;span style="color:#000000"&gt;.&lt;/span&gt;raw &lt;span style="color:#000000"&gt;=&lt;/span&gt; skb&lt;span style="color:#000000"&gt;-&amp;gt;&lt;/span&gt;mac&lt;span style="color:#000000"&gt;.&lt;/span&gt;raw &lt;span style="color:#000000"&gt;+&lt;/span&gt; &lt;span style="color:#7e0050"&gt;2&lt;/span&gt;&lt;span style="color:#000000"&gt;*&lt;/span&gt;ETH_ALEN &lt;span style="color:#000000"&gt;+&lt;/span&gt; &lt;span style="color:#7e0050"&gt;2&lt;/span&gt;&lt;span style="color:#000000"&gt;;&lt;/span&gt;&lt;br /&gt;    &lt;span style="color:#000000; font-weight:bold"&gt;memcpy&lt;/span&gt;&lt;span style="color:#000000"&gt;(&lt;/span&gt;skb&lt;span style="color:#000000"&gt;-&amp;gt;&lt;/span&gt;nh&lt;span style="color:#000000"&gt;.&lt;/span&gt;raw&lt;span style="color:#000000"&gt;,&lt;/span&gt; data&lt;span style="color:#000000"&gt;,&lt;/span&gt; length&lt;span style="color:#000000"&gt;);&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;    &lt;span style="color:#6b6b6b; font-style:italic"&gt;// - 4 wegen CRC-32&lt;/span&gt;&lt;br /&gt;    &lt;span style="color:#000000; font-weight:bold"&gt;memset&lt;/span&gt;&lt;span style="color:#000000"&gt;(&lt;/span&gt;skb&lt;span style="color:#000000"&gt;-&amp;gt;&lt;/span&gt;nh&lt;span style="color:#000000"&gt;.&lt;/span&gt;raw &lt;span style="color:#000000"&gt;+&lt;/span&gt; length&lt;span style="color:#000000"&gt;,&lt;/span&gt; &lt;span style="color:#7e0050"&gt;0xa5&lt;/span&gt;&lt;span style="color:#000000"&gt;,&lt;/span&gt; size &lt;span style="color:#000000"&gt;-&lt;/span&gt; length &lt;span style="color:#000000"&gt;-&lt;/span&gt; &lt;span style="color:#7e0050"&gt;2&lt;/span&gt;&lt;span style="color:#000000"&gt;*&lt;/span&gt;ETH_ALEN &lt;span style="color:#000000"&gt;-&lt;/span&gt; &lt;span style="color:#7e0050"&gt;2&lt;/span&gt; &lt;span style="color:#000000"&gt;-&lt;/span&gt; &lt;span style="color:#7e0050"&gt;4&lt;/span&gt;&lt;span style="color:#000000"&gt;);&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;    &lt;span style="color:#6b6b6b; font-style:italic"&gt;// IEEE 802.3 CRC-32 (ganzes Ethernet-Packet ohne die CRC selbst)&lt;/span&gt;&lt;br /&gt;    fcs &lt;span style="color:#000000"&gt;= ~(&lt;/span&gt;&lt;span style="color:#000000; font-weight:bold"&gt;crc32_le&lt;/span&gt;&lt;span style="color:#000000"&gt;(~&lt;/span&gt;&lt;span style="color:#7e0050"&gt;0&lt;/span&gt;&lt;span style="color:#000000"&gt;,&lt;/span&gt; skb&lt;span style="color:#000000"&gt;-&amp;gt;&lt;/span&gt;data&lt;span style="color:#000000"&gt;,&lt;/span&gt; skb&lt;span style="color:#000000"&gt;-&amp;gt;&lt;/span&gt;len &lt;span style="color:#000000"&gt;-&lt;/span&gt; &lt;span style="color:#7e0050"&gt;4&lt;/span&gt;&lt;span style="color:#000000"&gt;));&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;    &lt;span style="color:#000000; font-weight:bold"&gt;memcpy&lt;/span&gt;&lt;span style="color:#000000"&gt;(&lt;/span&gt;skb&lt;span style="color:#000000"&gt;-&amp;gt;&lt;/span&gt;nh&lt;span style="color:#000000"&gt;.&lt;/span&gt;raw &lt;span style="color:#000000"&gt;+&lt;/span&gt; length &lt;span style="color:#000000"&gt;+ (&lt;/span&gt;size &lt;span style="color:#000000"&gt;-&lt;/span&gt; length &lt;span style="color:#000000"&gt;-&lt;/span&gt; &lt;span style="color:#7e0050"&gt;2&lt;/span&gt;&lt;span style="color:#000000"&gt;*&lt;/span&gt;ETH_ALEN &lt;span style="color:#000000"&gt;-&lt;/span&gt; &lt;span style="color:#7e0050"&gt;2&lt;/span&gt; &lt;span style="color:#000000"&gt;-&lt;/span&gt; &lt;span style="color:#7e0050"&gt;4&lt;/span&gt;&lt;span style="color:#000000"&gt;), &amp;amp;&lt;/span&gt;fcs&lt;span style="color:#000000"&gt;,&lt;/span&gt; &lt;span style="color:#7e0050"&gt;4&lt;/span&gt;&lt;span style="color:#000000"&gt;);&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;    &lt;span style="color:#000000; font-weight:bold"&gt;NF_HOOK&lt;/span&gt;&lt;span style="color:#000000"&gt;(&lt;/span&gt;PF_BRIDGE&lt;span style="color:#000000"&gt;,&lt;/span&gt; NF_BR_LOCAL_OUT&lt;span style="color:#000000"&gt;,&lt;/span&gt; skb&lt;span style="color:#000000"&gt;,&lt;/span&gt; NULL&lt;span style="color:#000000"&gt;,&lt;/span&gt; skb&lt;span style="color:#000000"&gt;-&amp;gt;&lt;/span&gt;dev&lt;span style="color:#000000"&gt;,&lt;/span&gt; dev_queue_xmit&lt;span style="color:#000000"&gt;);&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#000000"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1312036047635172421-9203822179863600796?l=aboutinformationtechnologies.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://aboutinformationtechnologies.blogspot.com/feeds/9203822179863600796/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1312036047635172421&amp;postID=9203822179863600796' title='0 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1312036047635172421/posts/default/9203822179863600796'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1312036047635172421/posts/default/9203822179863600796'/><link rel='alternate' type='text/html' href='http://aboutinformationtechnologies.blogspot.com/2007/12/versenden-eines-ethernet-frames-mit.html' title='Versenden eines Ethernet - Frames mit richtiger Frame Check Sequence'/><author><name>Christoph Jud</name><uri>http://www.blogger.com/profile/12319992956473639407</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1312036047635172421.post-8874892115221850356</id><published>2007-12-05T12:20:00.001+01:00</published><updated>2007-12-05T19:05:02.388+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Windows Netzwerke'/><title type='text'>CD rippen ohne Administratorenrechte</title><content type='html'>&lt;b style="font-family: verdana;"&gt;Problem&lt;o:p&gt;&lt;/o:p&gt;&lt;/b&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;Arbeitet man unter Windows 2k/XP mit Administratorenrechten öffnet man gleichzeitig auch jedem Virus Tür und Tore, um das System zu zerstören. Auch wird das System unwissentlich vom Benutzer falsch bedient. Darum ist es empfehlenswert mit einem &lt;/span&gt;&lt;i style="font-family: verdana;"&gt;Hauptbenutzer&lt;/i&gt;&lt;span style="font-family:verdana;"&gt; seinen Täglichen Arbeiten nach zu gehen um das System von diesen zwei Faktoren zu schützen.&lt;/span&gt;&lt;br /&gt;&lt;b style="font-family: verdana;"&gt;&lt;br /&gt;Beispiel&lt;o:p&gt;&lt;/o:p&gt;&lt;/b&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;Unter Windows 2k/XP gibt es einige Applikationen die scheinbar Administratorenrechte voraussetzen. So zum Beispiel auch jede Software, mit der CDs gerippt werden können, und welche die &lt;/span&gt;&lt;i style="font-family: verdana;"&gt;NT SCSI&lt;/i&gt;&lt;span style="font-family:verdana;"&gt; Bibliothek benutzt. „CDex Audio CD extractor“ ist beispielsweise eine solche Software.      &lt;/span&gt;&lt;p style="font-family: verdana;" class="MsoNormal"&gt;&lt;b style=""&gt;Lösung&lt;o:p&gt;&lt;/o:p&gt;&lt;/b&gt;&lt;br /&gt;Damit diese Software trotz eingeschränkten Benutzerrechten auf die besagte Bibliothek zugreifen kann eine lokale Sicherheitsrichtlinie gesetzt werden. Diese findet man unter: &lt;i style=""&gt;Sicherheitseinstellungen/Lokale Richtlinien/Sicherheitsoptionen&lt;/i&gt; und heisst: &lt;b style=""&gt;&lt;i style=""&gt;Geräte: Zugriff auf CD-ROM-Laufwerke auf lokal angemeldete Benutzer beschränken&lt;/i&gt;&lt;/b&gt;. Diese muss aktiviert werden. Hierfür sind Administratorenrechte erforderlich.&lt;/p&gt;&lt;p style="font-family: verdana;" class="MsoNormal"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_b8WdzBBgi5c/R1a2o38M9pI/AAAAAAAAABA/Zhnv7ewl8_c/s1600-h/cd-rip_without_admin.JPG"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://4.bp.blogspot.com/_b8WdzBBgi5c/R1a2o38M9pI/AAAAAAAAABA/Zhnv7ewl8_c/s400/cd-rip_without_admin.JPG" alt="" id="BLOGGER_PHOTO_ID_5140496838017480338" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p style="font-family: verdana;" class="MsoNormal"&gt;&lt;i style=""&gt;Tipp:&lt;/i&gt;&lt;/p&gt;&lt;ul style="font-family: verdana;"&gt;&lt;li&gt;Rechtsklick auf Dos-Shell&lt;/li&gt;&lt;li&gt;Ausführen als…&lt;/li&gt;&lt;li&gt;Administratoren Passwort eingeben&lt;/li&gt;&lt;li&gt;secpol.msc ausführen&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1312036047635172421-8874892115221850356?l=aboutinformationtechnologies.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://aboutinformationtechnologies.blogspot.com/feeds/8874892115221850356/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1312036047635172421&amp;postID=8874892115221850356' title='0 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1312036047635172421/posts/default/8874892115221850356'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1312036047635172421/posts/default/8874892115221850356'/><link rel='alternate' type='text/html' href='http://aboutinformationtechnologies.blogspot.com/2007/12/cd-rippen-ohne-administratorenrechte.html' title='CD rippen ohne Administratorenrechte'/><author><name>Christoph Jud</name><uri>http://www.blogger.com/profile/12319992956473639407</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_b8WdzBBgi5c/R1a2o38M9pI/AAAAAAAAABA/Zhnv7ewl8_c/s72-c/cd-rip_without_admin.JPG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1312036047635172421.post-2888386008323825503</id><published>2007-11-27T14:37:00.000+01:00</published><updated>2008-01-10T16:07:05.877+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Windows Netzwerke'/><title type='text'>Terminal Server auf einem Domain Controller</title><content type='html'>&lt;span style="font-weight: bold;font-family:verdana;" &gt;Szenario&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;&lt;span style="font-family:verdana;"&gt;In einem KMU wird ein Windows Server 2003 angeschafft, der sowohl als Domänenkontroller sowie auch als Terminalserver fungieren soll, da nur ein Computer für den Einsatz als Server zu Verfügung steht.&lt;/span&gt;      &lt;/span&gt;&lt;p style="font-family: verdana;" face="verdana" class="MsoNormal"&gt;Vorteil: Es wird nur eine Hardware benötigt.&lt;br /&gt;Nachteil: Domänenkontroller muss sich die Performance mit dem Terminalserver teilen.&lt;/p&gt;  &lt;span style="font-weight: bold;font-family:verdana;" &gt;Vorgaben&lt;/span&gt;&lt;br /&gt;&lt;ul style="margin-top: 0cm; font-family: verdana;" type="disc"&gt;&lt;li class="MsoNormal" style=""&gt;Eine      ausgewählte Gruppe von Benutzern sollen auf den Terminalserver zugreifen      können, jedoch mit starken Restriktionen. Auf den Arbeitsstationen aber      sollen sie normale Benutzerberechtigungen zugeteilt bekommen. &lt;/li&gt;&lt;li class="MsoNormal" style=""&gt;Die      Restriktionen sollen nur auf dem Terminalserver angewendet werden, damit andere Computer      nicht davon betroffen sind.&lt;/li&gt;&lt;li class="MsoNormal" style=""&gt;Den      Domänenadministratoren ist es gestattet mit voller Zugriffsberechtigungen      auf dem Terminalserver zu arbeiten. &lt;/li&gt;&lt;/ul&gt;  &lt;span style="font-weight: bold;font-family:verdana;" &gt;Benennung&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;In der hier gezeigten Lösung wurden folgende Namen definiert:      &lt;/span&gt;&lt;p class="MsoNormal" face="verdana"&gt;&lt;o:p style="font-family: verdana;"&gt;&lt;/o:p&gt;&lt;span style="font-family:verdana;"&gt;Domäne:                          experiment.ch&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;Domänenkontroller:      EXPERIMENT&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;p class="MsoNormal" face="verdana"&gt;  &lt;/p&gt;&lt;p class="MsoNormal" style="font-family: verdana;"&gt;&lt;span style="font-weight: bold;"&gt;Mögliche Konfiguration&lt;/span&gt;&lt;br /&gt;Es wird eine globale Gruppe „Terminal Server Users“ erstelle, der alle Benutzer angehören die auf den Terminalserver zugreifen müssen. Wo in der Domäne sich diese Gruppe befindet kann nach belieben festgelegt werden.&lt;/p&gt;    &lt;p style="font-family: verdana;" face="verdana" class="MsoNormal"&gt;&lt;o:p&gt;&lt;/o:p&gt;In den lokalen Richtlinien des Terminalserver Computers wird der Gruppe die Berechtigung für das „&lt;i style=""&gt;Anmelden über Terminaldienste zulassen&lt;/i&gt;“ erteilt.&lt;/p&gt;  &lt;p style="font-family: verdana;" face="verdana" class="MsoNormal"&gt;Pfad: &lt;i style=""&gt;Richtlinien für Lokaler Computer/Computerkonfiguration/Windows-Einstellungen/Lokale Richtlinien/Zuweisen von Benutzerrechten&lt;o:p&gt;&lt;/o:p&gt;&lt;/i&gt;&lt;/p&gt;    &lt;p style="font-family: verdana;" face="verdana" class="MsoNormal"&gt;&lt;o:p&gt;&lt;/o:p&gt;Ebenfalls bekommt die Gruppe Benutzerzugriff auf die Terminalserververbindung in der Terminalserverkonfiguration.&lt;/p&gt;        &lt;p style="font-family: verdana;" face="verdana" class="MsoNormal"&gt;&lt;o:p&gt;&lt;/o:p&gt;Die Benutzer der Gruppe „Terminal Server Users“ sollten nun bereits auf den Terminalserver zugreifen können, noch aber ohne Restriktionen.&lt;o:p&gt;&lt;/o:p&gt;&lt;/p&gt;&lt;p style="font-family: verdana;" face="verdana" class="MsoNormal"&gt;&lt;o:p&gt;&lt;/o:p&gt;Auf die Organisationseinheit „&lt;i style=""&gt;Domain Controllers&lt;/i&gt;“, in der sich das Computerobjekt des Domänenkontroller befindet wird eine neue Gruppenrichtlinie angewendet.&lt;/p&gt;&lt;p style="font-family: verdana;" face="verdana" class="MsoNormal"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_b8WdzBBgi5c/R0wfSNGThzI/AAAAAAAAAAM/IFPyaZVyxuM/s1600-h/policies.bmp"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://2.bp.blogspot.com/_b8WdzBBgi5c/R0wfSNGThzI/AAAAAAAAAAM/IFPyaZVyxuM/s320/policies.bmp" alt="" id="BLOGGER_PHOTO_ID_5137515672537106226" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p style="font-family: verdana;" face="verdana" class="MsoNormal"&gt;  &lt;/p&gt;&lt;p style="font-family: verdana;" face="verdana" class="MsoNormal"&gt;Zentral bei dieser Gruppenrichtlinie ist der &lt;i style=""&gt;Loopbackverarbeitungsmodus&lt;/i&gt;. Dieser bewirkt, dass nicht die Benutzereinstellungen des Benutzers sondern diejenige dieser Gruppenrichtlinie angewandt wird, wenn sich ein Benutzer an ein Computer dieser Organisationseinheit anmeldet.&lt;/p&gt;  &lt;p style="font-family: verdana;" face="verdana" class="MsoNormal"&gt;Pfad: &lt;i style=""&gt;Terminal Server Users Policy/Computerkonfiguration/Administrative Vorlagen/System/Gruppenrichtlinien&lt;/i&gt;&lt;/p&gt;    &lt;p face="verdana" class="MsoNormal"&gt;&lt;o:p&gt;&lt;/o:p&gt;Weiter können anschliessend die Restriktionen unter der Benutzerkonfiguration eingestellt werden.&lt;/p&gt;&lt;p face="verdana" class="MsoNormal"&gt;  &lt;/p&gt;&lt;p face="verdana" class="MsoNormal"&gt;&lt;b style=""&gt;Achtung:&lt;/b&gt;&lt;span style=""&gt;         &lt;/span&gt;Wird die Gruppenrichtlinie nun so eingesetzt, würden auch die Domänenadministratoren eingeschränkt werden, was meist nicht erwünscht ist. Deswegen müssen noch Berechtigungen auf die Gruppenrichtlinien vergeben werden.&lt;/p&gt;    &lt;p face="verdana" class="MsoNormal"&gt;In den Sicherheitseigenschaften sollten folgende Anpassungen vorgenommen werden:&lt;/p&gt;  &lt;ul style="margin-top: 0cm; font-family: verdana;" type="disc"&gt;&lt;li class="MsoNormal" style=""&gt;Gruppe „&lt;i style=""&gt;Authentifizierte Benutzer&lt;/i&gt;“      entfernen&lt;/li&gt;&lt;li class="MsoNormal" style=""&gt;Der      Gruppe „&lt;i style=""&gt;Domänen-Amins&lt;/i&gt;“ expliziet      die Gruppenrichtlinienübernahme verweigern&lt;/li&gt;&lt;li class="MsoNormal" style=""&gt;Die      Gruppe „&lt;i style=""&gt;Terminal Server Users&lt;/i&gt;“      hinzufügen mit Lese- und Gruppenrichtlinienübernahme Berechtigung&lt;/li&gt;&lt;li class="MsoNormal" style=""&gt;Computerobjekt      des Terminalservers hinzufügen mit Lese- und Gruppenrichtlinienübernahme      Berechtigung &lt;/li&gt;&lt;/ul&gt; &lt;a style="font-family: verdana;" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_b8WdzBBgi5c/R0wgWNGTh0I/AAAAAAAAAAU/E_UR28-eWdM/s1600-h/seq_tsusers.bmp"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://2.bp.blogspot.com/_b8WdzBBgi5c/R0wgWNGTh0I/AAAAAAAAAAU/E_UR28-eWdM/s320/seq_tsusers.bmp" alt="" id="BLOGGER_PHOTO_ID_5137516840768210754" border="0" /&gt;&lt;/a&gt;  &lt;p face="verdana" class="MsoNormal"&gt;&lt;i style=""&gt;Die Gruppe „Authentifizierte Benutzer“ ist eigentlich ein Sicherheitsprinzipal, wird somit vom System verwaltet und kann nicht ohne Weiteres verändert werden. Auch können die dazugehörigen Benutzer nicht &lt;/i&gt;&lt;i style=""&gt;direkt &lt;/i&gt;&lt;i style=""&gt;aufgelistet oder beeinflusst werden.&lt;o:p&gt;&lt;/o:p&gt;&lt;/i&gt;&lt;/p&gt;      &lt;p style="font-family: verdana;" class="MsoNormal"&gt;&lt;b style=""&gt;Begründung für die Sicherheitseinstellung&lt;o:p&gt;&lt;/o:p&gt;&lt;/b&gt;&lt;br /&gt;Würde die Gruppe „&lt;i style=""&gt;Authentifizierte Benutzer&lt;/i&gt;“ nicht entfernt werden, gälte die Gruppenrichtlinie für alle Objekte die sich an der Domäne erfolgreich angemeldet haben. Das heisst nicht nur für sämtliche Benutzer sondern auch für alle Computer in dieser Organisationseinheit (&lt;span style="font-style: italic;"&gt;Domain Controllers&lt;/span&gt;). Ist dies gewünscht muss man bei der Gruppe „&lt;i style=""&gt;Domänen-Admins&lt;/i&gt;“ die Gruppenrichtlinienübernahme verweigern, damit der Administrator sich nicht selbst einschränkt. Will man aber die Gruppenrichtlinie nur explizit auf die „&lt;i style=""&gt;Terminal Server Users“&lt;/i&gt; anwenden muss die Gruppe „&lt;i style=""&gt;Authentifizierte Benutzer&lt;/i&gt;“ entfernt werden. Implizit entfernt man so auch das Computerobjekt des Domänenkontrollers. Darum muss der Computer „EXPERIMENT“ wieder für das Lesen und die Gruppenrichtlinienübernahme berechtig werden, da sonst die Richtlinie mangels Zugriffsberechtigung herausgefiltert wird, obwohl die Benutzergruppe „&lt;i style=""&gt;Terminal Server Users&lt;/i&gt;“ die benötigten Berechtigungen hätte. So kann man auch klar steuern auf welchem Computern die Gruppenrichtlinie gilt.&lt;/p&gt;&lt;br /&gt;&lt;p style="font-family: verdana;" class="MsoNormal"&gt;&lt;b style=""&gt;Nützliche Tools&lt;o:p&gt;&lt;/o:p&gt;&lt;/b&gt;&lt;br /&gt;Damit Änderungen an den Richtlinien sofort wirken, kann man den Befehl &lt;i style=""&gt;gpupdate /force&lt;/i&gt; in der Shell ausführen.&lt;/p&gt;    &lt;p style="font-family: verdana;" class="MsoNormal"&gt;&lt;o:p&gt;&lt;/o:p&gt;Bei komplexeren Domänenstrukturen oder Richtlinienhierarchien ist das Tool &lt;i style=""&gt;gpresult&lt;/i&gt; nicht weg zu denken. Dort kann man anzeigen lassen welche Gruppenrichtlinien bei einem Benutzer auf einem Bestimmten Computer angewandt und welche gefiltert werden.&lt;/p&gt;  &lt;p style="font-family: verdana;" class="MsoNormal"&gt;Syntax: &lt;i style=""&gt;gpresult /u Benutzername /s Computername&lt;/i&gt;&lt;/p&gt;&lt;br /&gt;&lt;p style="font-family: verdana;" class="MsoNormal"&gt;&lt;span style="font-weight: bold;"&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="font-family: verdana;" class="MsoNormal"&gt;  &lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1312036047635172421-2888386008323825503?l=aboutinformationtechnologies.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://aboutinformationtechnologies.blogspot.com/feeds/2888386008323825503/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1312036047635172421&amp;postID=2888386008323825503' title='0 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1312036047635172421/posts/default/2888386008323825503'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1312036047635172421/posts/default/2888386008323825503'/><link rel='alternate' type='text/html' href='http://aboutinformationtechnologies.blogspot.com/2007/11/terminal-server-auf-einem-domain.html' title='Terminal Server auf einem Domain Controller'/><author><name>Christoph Jud</name><uri>http://www.blogger.com/profile/12319992956473639407</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_b8WdzBBgi5c/R0wfSNGThzI/AAAAAAAAAAM/IFPyaZVyxuM/s72-c/policies.bmp' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1312036047635172421.post-169190842644321533</id><published>2007-11-15T14:00:00.000+01:00</published><updated>2007-11-15T14:20:34.578+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Allerlei'/><title type='text'>Go!</title><content type='html'>&lt;p class="MsoNormal"&gt;In meinem jugendlichen Leichtsinn habe ich nun in einer freien Stunde einen Blog eröffnet. Somit gehöre ich auch zum heutigen Hype und zur modernen Bewegung des Web 2.0. Also kann ich nun überall Respekt ernten indem ich mich einen Blogger nenne. Schön nicht? Gelassen werde ich also auch überall meinen Senf dazu geben, den wahrscheinlich niemand interessieren wird.&lt;/p&gt;&lt;p class="MsoNormal"&gt;---&lt;br /&gt;&lt;/p&gt;    &lt;p class="MsoNormal" style=""&gt;In meinem Weblog werde ich technische Probleme und deren Lösungen aufzeigen, welchen ich in irgendeiner Art und Weise begegnet bin. Dies sollte anderen mit selben Problemen weiter helfen, und für mich sollte es eine Art Problem-History sein.&lt;o:p&gt;&lt;/o:p&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style=""&gt;Man wird sehen wie oft und motiviert ich schreiben werde.&lt;br /&gt;&lt;/p&gt;&lt;p class="MsoNormal" style=""&gt;Hoffen wir auf ein Wiederlesen. (höhö)&lt;o:p&gt;&lt;/o:p&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;br /&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1312036047635172421-169190842644321533?l=aboutinformationtechnologies.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1312036047635172421/posts/default/169190842644321533'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1312036047635172421/posts/default/169190842644321533'/><link rel='alternate' type='text/html' href='http://aboutinformationtechnologies.blogspot.com/2007/11/go.html' title='Go!'/><author><name>Christoph Jud</name><uri>http://www.blogger.com/profile/12319992956473639407</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry></feed>
