A
Xenomorphobia schrieb:
asc schrieb:
b) malloc/free sollte man in C++ mit Vorsicht verwenden (Kein Konstruktor-/Destruktoraufruf...), besser new/delete
Das habe ich, weil gelesen, erfolglos versucht.
Würdest du auch sagen, was der Misserfolg war?
// Auch wenn die dynamische Reservierung in deinen Fall für überflüssig halte
char * pc = new char[20]; // Verwendung von new[] bei Arrays
delete pc[]; // Freigabe mittels delete[]
int * pi = new int(0); // Verwendung von new für Einzelwerte
delete pi; // Freigabe mittels delete
Xenomorphobia schrieb:
Das ich so intensiv dynamisch Speicher alloziiere kommt daher, dass ich auch schon in C lieber mit Zeigern programmierte als "call by value" zu nutzen - uns wurden ja auch die Vorteile der Zeiger nicht vorenthalten.
In C++ kann man Referenzen verwenden:
#include <iostream>
#include <string>
void foo(
int & v1, // Referenzen sind nur Aliasnamen für die Urprungsvariable
std::string & v2) // Konkret:
{ // a) Im Gegensatz zu Zeigern MUSS ein gültiger Wert
v1 = 10; // existieren (NULL ist unzulässig)
v2 = "abcde"; // b) Eine Werteänderung über die Referenz ändert die
} // Ursprungsvariable
// c) Referenzen lassen sich nicht "umbiegen"
void foo2(
int const & v1, // Referenzen auf konstanten Wert, keine Kopie aber
std::string const & v2) // auch keine Änderung möglich
{
std::cout << i << " " << a; // Ausgabe von "10 abcde"
}
int main()
{
int i;
std::string a;
foo(i, a);
foo2(i, a);
}
Sofern man also keine NULL-Werte zulassen will, und auch kein "umbiegen" (Wie eine Zeigeränderung ja im Gegenzu ermöglicht) sind Referenzen ebenso geeignet. Man sollte tatsächlich Call-By-Value bei nicht Integralen Datentypen verwenden aber Referenzen ermöglichen dies ohne über Zeigerbehandlung nachdenken zu müssen (const & sollte man Verwenden wenn man keine Änderung zulassen will).
cu André