K
TauCeti schrieb:
Wie funktionert der Mechanismus als Ersatz für "new"? Wie werden denn dann Instanzen erzeugt?
new bzw deren modernere Alternativen sind nur dazu da, Platz im Freispeicher zu reservieren und dort etwas abzulegen. In vielen Fällen kann man das Containern überlassen. Und Container selbst kann man zum Beispiel im automatischen Speicher anlegen. Das kann dann so aussehen:
#include <algorithm>
#include <iostream>
#include <vector>
int main() {
std::vector<int> data;
int temp;
while (std::cin >> temp) { // solange Zahlen einlesen bis Ende
data.push_back(temp);
}
std::sort(data.begin(), data.end()); // Eingabe sortieren
for (int x : data) {
std::cout << x << '\n'; // ...und wieder ausgeben.
}
return 0;
}
Hier findest du kein new. Und dennoch wird der Freispeicher genutzt. Das erledigt aber std::vector für uns. Und das ist gut so. Der Vektor lebt "gefühlt" als lokale Variable im automatischen Speicher. Unter der Haube kümmert sich der vector für uns um die Freispeicherverwaltung seiner Elemente.
Neben std::vector gibt's natürlich auch noch einige andere praktische Datenstrukturen, std::deque, std::map, std::unordered_map, etc.
Ohne new und mit den Containern aus der Standardbibliothek kommt man schon ziemlich weit! Ich benutze auch fast nix anderes.
Falls es dann doch nicht reicht, gibt's in <memory> noch etwas was dich interessieren könnte. Da fallen mir aber keine guten Anwendungsbeispiele für ein, gerade. Nur zu Demonstrationszwcken:
struct ding {
double x, y;
ding(double x, double y) : x(x), y(y) {}
};
int main() {
auto ob = ding(3.1415, 99.0); // OK
auto rp = new ding(55.4, 33.2); // Bitte vermeiden!
auto up = std::make_unique<ding>(123.0,456.0); // OK
auto sp = std::make_shared<ding>(2.17,66.6); // OK
// ob: ding (das Objekt direkt selbst im Stack lebend)
// rp: ding* (roher Zeiger, der in den Freispeicher reinzeigt, sich
// aber dafür nicht verantwortlich fühlt)
// up: unique_ptr<ding> (fühlt sich als alleiniger Besitzer des im
// im Freispeicher lebenden ding-Objekts)
// sp: shared_ptr<ding> (fühlt sich als einer von potentiell mehreren
// Besitzern des Freispeicher Objekts, wo jetzt
// auch in der Nähe ein Referenzzähler dranhängt)
}
Alle ding-Objekte bis auf das, worauf rp zeigt, werden hier automatisch zerstört und deren Speicher wieder freigegeben.