Pointer freigeben:
-
// Pointer auf BlaBla setzen BlaBla *meinPointer = NULL; // diverser anderer Code... if(meinPointer) // wenn Pointer != NULL, dann if-Anweisungen ausführen { meinPointer->Release(); // gehört das zum C++-Standard? Was bewirkt's? meinPointer = NULL; }
a) siehe Frage in Code
b) ist es so richtig oder geht's noch besser, wenn ich einen Pointer freigeben möchte?Danke
-
Das gehört nicht zum Standard, den man immer noch mit "d" schreibt, daher auch die Sterne.
Wie (und ob) du ihn freigeben musst, hängt davon ab, wie du ihn allokiert hast.
-
Ah, jetzt versteh ich die Sternchen. *g*
Welche Möglichkeiten gibt's denn einen Pointer zu allokieren?
Kenne nur diese Methode ... I guess
-
Welche Methode kennst du denn ?
In deinem Codebeispiel sehe ich KEINE.
-
//c style unsigned char* ucpBuffer = malloc ( 1024 ); //1024 bytes holen free ( ucpBuffer ); // speicher freigeben ucpBuffer = NULL; //zeiger auf 0 setzen //c++ style ucpBuffer = new unsigned char [ 1024 ]; //1024 bytes holen delete [] ucpBuffer; // speicher freigeben ucpBuffer = NULL; //zeiger auf 0 setzen //nochma c++ mit klassen Objekt* pObjekt = new Objekt; //neues objekt erstellen delete pObjekt; //objekt löschen pObjekt = NULL; //zeiger auf 0 setzen
-
shareholder schrieb:
Welche Möglichkeiten gibt's denn einen Pointer zu allokieren?
Arbeitest du mit der VCL vom C++Builder? Ich glaube, dort gibt es Methoden namens Release... Laut der Doku soll man diese aber nicht aufrufen, sondern
delete pToClassDerivedFromTObject;
!
Allozieren tut man Speicher so:
class class1 { ... }; class1* pc1 = new class1; // alloziert Speicher für ein class1-Objekt auf dem Heap ... delete pc1; // gibt den Speicher wieder frei
Moritz
-
Ich kenne mich mit der dynamischen Speicherallokation ja nicht besonders gut aus, aber sollte man in C++ nicht nur free() verwenden?
MfG CSS
-
CSS schrieb:
Ich kenne mich mit der dynamischen Speicherallokation ja nicht besonders gut aus, aber sollte man in C++ nicht nur free() verwenden?
nee, c++ freaks nehmen new/delete bzw. delete[]. malloc und free ist c-style, funzt aber auch unter c++
-
nee, c++ freaks nehmen new/delete bzw. delete[]. malloc und free ist c-style, funzt aber auch unter c++
Gründe für malloc()/free() mit C++:
KEINE
Gründe gegen malloc()/free() mit C++:
allerdings (teilweise) erhebliche
-
Kann es sein, dass diese Thread ziemlich in die Hose ging? Die einzig brauchbare Antwort ist Sovoks, den Rest könnte man getrost im Datennirvana versenken...
-
Chew-Z schrieb:
Gründe für malloc()/free() mit C++:
KEINEdoch, man braucht nicht zwischen delete und delete[] zu unterscheiden
CarstenJ schrieb:
Kann es sein, dass diese Thread ziemlich in die Hose ging?
wieso? tggc hat sich noch nicht gemeldet
-
CarstenJ schrieb:
Kann es sein, dass diese Thread ziemlich in die Hose ging? Die einzig brauchbare Antwort ist Sovoks, den Rest könnte man getrost im Datennirvana versenken...
Nice. An diesem Forum hat mir gleich der nette Umgangston gefallen. Ich finds auch toll, daß Neulinge oft gleich sarkastisch fertiggemacht werden...
-
Danke Euch hierhin ersteinmal,
Habe ich das jetzt richtig verstanden...
Da ich keinen Speicher reserviert habe, muss ich den Pointer auch nicht zwingend wieder freigeben?(@audacia, nein: mit MSVC++ .NET)
-
Naja, eigentlich ist das hier schon ok, aber ich find es manchmal unangebracht, über ein recht einfaches Thema 2-3 Seiten zu "verschwenden". Der OP wird wahrscheinlich verwirrter sein als vorher, da immer nur ein paar Informationsfetzen hingeworfen werden, die aber auch nicht so richtig erläutert werden.
EDIT:
Habe ich das jetzt richtig verstanden...
Da ich keinen Speicher reserviert habe, muss ich den Pointer auch nicht zwingend wieder freigeben?Ja, wenn du kein NEW benutzt (zum allokieren) musst du auch kein DELETE (zum freigeben) benutzen.
-
Danke CarstenJ & Andere
-
Aufgrund deines Beispiels nehme ich an das IRGENDJEMAND den Speicher
zu dem Pointer allokiert den du geliefert bekommen hast.
In diesem Sinne könnte der Aufruf von Release() vom Ersteller der Funktion
so geplant, dokumentiert(hoffentlich) und daher zwwingend erforderlich sein.
-
Hallo,
nebenbei bemerkt ist release schon Standard, hat aber was mit dem std::auto_ptr zu tun:
http://www.gotw.ca/publications/using_auto_ptr_effectively.htmIst auch nicht verkehrt, das zu kennen.
-
nö
HRESULT CXmlParserDlg::CheckLoad(IXMLDOMDocument *pDoc) { HRESULT hResult = E_FAIL; long lErrorCode = E_FAIL; IXMLDOMParseError *pXMLError = NULL; if (SUCCEEDED(pDoc->get_parseError(&pXMLError)) && SUCCEEDED(pXMLError->get_errorCode(&lErrorCode)) && ( lErrorCode != 0 ) ) hResult = ReportError(pXMLError); // // Clean-up pointers used. // if ( pXMLError ) { pXMLError->Release(); pXMLError = NULL; } // // Pass back the return code. // return lErrorCode; }
-
Also doch, COM-Programmierung
Release() dekrementiert den Referenzzähler eines COM-Objekts.
Es sollte daher in keinem Fall vergessen werden. Sonst gibts Leichen,
ähnlich wie bei fehlendem delete() oder free().
-
Ui, viel Spaß. COM mit C++ ist nicht gerade "for the faint of heart". Also wenn du keine Ahnung von Speicherverwaltung hast, wirst du damit vermutlich noch kräftig auf die Nase fallen, nur so als Vorwarnung ;).
EDIT: Bei BCB sind übrigens die xxxPtr-Klassen sehr nützlich (also z.B. IXMLDOMParseErrorPtr) - zumindest wären sie es, wenn der Compiler beim Auftreten von Exceptions den Destructor aufrufen würde, was er eigentlich sollte. Ab einer gewissen Funktionskomplexität vergisst er aber leider zunehmend darauf... Macht die Sache auch nicht gerade lustiger :(.