007
27.08.2006, 17:45 Uhr
enriico
|
Diese Boost-Klasse erlaubt sicheres Verwenden von mit new angelegten Objekten in Containern. Diese werden automatisch aufgeräumt, sobald nirgends mehr auf sie referenziert wird.
Ich habe dir hier ein kleines Beispiel gemacht, wie du mit boost arbeiten kannst!
C++: |
#include <iostream> #include <string> #include <vector> #include <boost/shared_ptr.hpp>
using namespace std;
struct Drug { Drug(string strN, int intP) : intPrice(intP),strName(strN) {} ~Drug() { cout << "Sold out " << strName << endl; } int intPrice; string strName; };
typedef boost::shared_ptr<Drug> ptrDrug;
void print(ptrDrug const & refPtr) { cout << refPtr->strName << ": " << refPtr->intPrice << endl; }
int main() { vector<ptrDrug> refVec; ptrDrug pDrug1( new Drug("Cocain",100) ); refVec.push_back(pDrug1); { //pDrug2 wird nach dem Block ungültig sein ptrDrug pDrug2( new Drug("Ecstasy",10) ); refVec.push_back(pDrug2); } vector<ptrDrug>::iterator refIter; for (refIter=refVec.begin();refIter!=refVec.end();refIter++) { print(*refIter); //Zugriff auf Iterator-Element cout << "Referenzierungen: " << (*refIter).use_count() << endl; } refVec.clear(); } /* Output: * Cocain: 100 * Referenzierungen: 2 * Ecstasy: 10 * Referenzierungen: 1 * Sold out Ecstasy * Sold out Cocain */
|
Erklärung: -- Bei refVec.clear() sind alle Referenzierungen auf pDrug2 weg. Das Heap-Objekt wird also automatisch aufgeräumt. Auf pDrug1 existiert jedoch noch eine Referenzierung. Dieses Heap-Objekt wird erst am Programmende aufgeräumt.
-- use_count() gibt die Anzahl Referenzierungen auf den aktuellen shared_ptr zurück -- reset() erlaubt es eine Referenzierung zu löschen. (pDrug1.reset()). Dieser Post wurde am 27.08.2006 um 17:48 Uhr von enriico editiert. |