Эта небольшая статья в первую очередь предназначена для начинающих C++ программистов, которые либо слышали об умных указателях, но боялись их применять, либо они устали следить за new-delete. UPD: Статья писалась, когда C++11 еще не был так популярен. Итак, программисты С++ знают, что память нужно освобождать. Желательно всегда. И они знают...
Aber es lohnt sich wahrscheinlich, sich auf so etwas zu beschränken (man kann überhaupt nicht kopieren):
template <typename T_>
class unique_ptr{
T_ *p;
public:
unique_ptr(void *ptr=NULL): p(ptr) {}
~unique_ptr() {reset();}
unique_ptr *operator=(T_ *p_) {reset(); p = p_; return &this;}
// releases ownership of the managed object
T_ *release() {T_ *r = p; p = NULL; return r;}
// destroys the managed object void reset() {if(p) delete p; p=NULL;}
// returns a pointer to the managed object
T_ *get() {return p;}
unique_ptr(const unique_ptr<T_> &other);
voidoperator=(const unique_ptr<T_> &other);
void swap(unique_ptr<T_> &other){
T_ *buf = p;
p = other.p;
other.p = buf;
}
};
Warum habe ich das Kopieren für auto_ptr? Wegen der Krümmung von µl - um ein Stack-Objekt in CArrayObj zu kopieren, müssen Sie eine Reihe von Objekten erstellen, indem Sie den Konstruktor mehrmals aufrufen. Aber ich glaube nicht, dass es das wert ist. In diesem Zusammenhang werde ich den ersten Beitrag löschen.
Warum habe ich das Kopieren für auto_ptr? Wegen der μl-Krümmung - um ein Stack-Objekt in CArrayObj zu kopieren, müssen Sie eine Reihe von Objekten erstellen, indem Sie den Konstruktor mehrmals aufrufen.
Die triviale Aufgabe, eine Kopie eines Stack-Objekts zu einem Array hinzuzufügen, besteht darin, einen Standardkonstruktor hinzuzufügen, den ich von vornherein nicht brauchte:
Es ist nicht fatal, ja, Sie können init() in Q ausführen, was das Problem ein wenig glättet, aber es ist trotzdem ekelhaft. Und beim Kopieren von auto_ptr auf der Hand, alles geschieht in zwei Zeilen, aber das Spiel ist nicht wert die Mühe. Vielleicht zu wählerisch, Perfektionismus.
Die triviale Aufgabe, eine Kopie eines Stack-Objekts zu einem Array hinzuzufügen, entpuppt sich als Folgendes: Ich muss einen Standardkonstruktor vorschreiben, den ich gar nicht brauche:
Es ist nicht fatal, ja, Sie können init() bei Q ausführen, was das Problem etwas glättet, aber es ist immer noch ekelhaft. Und beim Kopieren von auto_ptr auf der Hand, alles geschieht in zwei Zeilen, aber das Spiel ist nicht wert die Mühe. Vielleicht zu wählerisch, Perfektionismus.
Aber es ist genau das gleiche in C++ auch, so ist es nicht wirklich klar, warum die krumme mcl.
Und in Ihrem Fall ist es einfacher, einen Kopierkonstruktor anzugeben und Elemente mit einer Zeile hinzuzufügen:
Die triviale Aufgabe, eine Kopie eines Stack-Objekts zu einem Array hinzuzufügen, entpuppt sich als Folgendes: Ich muss einen Standardkonstruktor schreiben, den ich überhaupt nicht benötige:
Es ist nicht fatal, ja, Sie können init() bei Q ausführen, was das Problem ein wenig glättet, aber es ist immer noch ekelhaft. Und wenn man auto_ptr kopiert, passiert alles in zwei Zeilen, aber das Spiel ist die Mühe nicht wert. Vielleicht zu wählerisch, Perfektionismus.
Das ist, wie es alle sowieso passiert - es ist nur hinter Ihrem auto_ptr versteckt...
Ich sehe hier keine besonderen Probleme.
Als abgehärteter Oldtimer mag ich den C#-Ansatz, bei dem der Speicher automatisch gelöscht wird, wirklich nicht. Meiner Meinung nach sollte die Person, die die Löschung von Objekten beantragt hat, dafür verantwortlich sein und nicht irgendwelche "Müllsammler".
Und in Ihrem Fall ist es einfacher, den Kopierkonstruktor zu setzen und Elemente mit einer Zeile hinzuzufügen
Natürlich ist es zum Beispiel eine Spielzeugklasse, in Wirklichkeit sind es auch einige Daten, wahrscheinlich eine Menge, es ist keine Option, überhaupt einen Kopierkonstruktor zu schreiben. An den richtigen Stellen in Wrapper eingewickelt und keine Notwendigkeit für einen benutzerdefinierten Konstruktor.
Es geschieht also alles trotzdem - es ist nur hinter Ihrem auto_ptr versteckt...
Ich sehe hier kein besonderes Problem.
Als abgehärteter Oldtimer mag ich den C#-Ansatz nicht, bei dem der Speicher automatisch gelöscht wird. Meiner Meinung nach sollte die Person, die die Löschung von Objekten beantragt hat, dafür verantwortlich sein, und nicht irgendein Müllsammler.
In µl können Sie auf intelligente Zeiger verzichten. Müllsammler != intelligente Zeiger, auf die man zumindest wegen der Ausnahmen nicht verzichten kann. Ich selbst mag keine Müllsammler.
Wenn Sie kein Benutzerkonto haben, registrieren Sie sich
Erlauben Sie die Verwendung von Cookies, um sich auf der Website MQL5.com anzumelden.
Bitte aktivieren Sie die notwendige Einstellung in Ihrem Browser, da Sie sich sonst nicht einloggen können.
Sie sind angemeldet. Die Zwei-Faktor-Authentifizierung wurde deaktiviert. Richten Sie sie erneut ein und scannen Sie einen neuen QR-Code oder fahren Sie mit deaktivierter Zwei-Faktor-Authentifizierung fort.
Forum zum Thema Handel, automatisierte Handelssysteme und Testen von Handelsstrategien
Wanzen, Wanzen, Fragen
fxsaber, 2018.12.01 11:15
Super-Bremse DesignDas Lesen einer 40-MB-Datei mit 1 Million Zeilen dauert 18 Sekunden.
Das gleiche Ergebnis, aber anders gemacht
Ist bereits in 0,5 Sekunden erledigt.
Ein einfaches Gegenstück zu auto_ptr (gilt als veraltet). Anmerkung: nicht ganz analog, mit
...
https://habr.com/post/140222/
pavlick_
Bei operator= müssen Sie am Anfang eine Zeile hinzufügen:
Aber es lohnt sich wahrscheinlich, sich auf so etwas zu beschränken (man kann überhaupt nicht kopieren):
Warum habe ich das Kopieren für auto_ptr? Wegen der Krümmung von µl - um ein Stack-Objekt in CArrayObj zu kopieren, müssen Sie eine Reihe von Objekten erstellen, indem Sie den Konstruktor mehrmals aufrufen. Aber ich glaube nicht, dass es das wert ist. In diesem Zusammenhang werde ich den ersten Beitrag löschen.Warum habe ich das Kopieren für auto_ptr? Wegen der μl-Krümmung - um ein Stack-Objekt in CArrayObj zu kopieren, müssen Sie eine Reihe von Objekten erstellen, indem Sie den Konstruktor mehrmals aufrufen.
Und warum "die Krümmung von μl"?
Und warum die "Krümmung des µl"?
Die triviale Aufgabe, eine Kopie eines Stack-Objekts zu einem Array hinzuzufügen, besteht darin, einen Standardkonstruktor hinzuzufügen, den ich von vornherein nicht brauchte:
Es ist nicht fatal, ja, Sie können init() in Q ausführen, was das Problem ein wenig glättet, aber es ist trotzdem ekelhaft. Und beim Kopieren von auto_ptr auf der Hand, alles geschieht in zwei Zeilen, aber das Spiel ist nicht wert die Mühe. Vielleicht zu wählerisch, Perfektionismus.
Die triviale Aufgabe, eine Kopie eines Stack-Objekts zu einem Array hinzuzufügen, entpuppt sich als Folgendes: Ich muss einen Standardkonstruktor vorschreiben, den ich gar nicht brauche:
Es ist nicht fatal, ja, Sie können init() bei Q ausführen, was das Problem etwas glättet, aber es ist immer noch ekelhaft. Und beim Kopieren von auto_ptr auf der Hand, alles geschieht in zwei Zeilen, aber das Spiel ist nicht wert die Mühe. Vielleicht zu wählerisch, Perfektionismus.
Aber es ist genau das gleiche in C++ auch, so ist es nicht wirklich klar, warum die krumme mcl.
Und in Ihrem Fall ist es einfacher, einen Kopierkonstruktor anzugeben und Elemente mit einer Zeile hinzuzufügen:
ar.Add(new Q(q));Die triviale Aufgabe, eine Kopie eines Stack-Objekts zu einem Array hinzuzufügen, entpuppt sich als Folgendes: Ich muss einen Standardkonstruktor schreiben, den ich überhaupt nicht benötige:
Es ist nicht fatal, ja, Sie können init() bei Q ausführen, was das Problem ein wenig glättet, aber es ist immer noch ekelhaft. Und wenn man auto_ptr kopiert, passiert alles in zwei Zeilen, aber das Spiel ist die Mühe nicht wert. Vielleicht zu wählerisch, Perfektionismus.
Das ist, wie es alle sowieso passiert - es ist nur hinter Ihrem auto_ptr versteckt...
Ich sehe hier keine besonderen Probleme.
Als abgehärteter Oldtimer mag ich den C#-Ansatz, bei dem der Speicher automatisch gelöscht wird, wirklich nicht. Meiner Meinung nach sollte die Person, die die Löschung von Objekten beantragt hat, dafür verantwortlich sein und nicht irgendwelche "Müllsammler".
Aber in C++ ist es genau dasselbe, so dass es nicht ganz klar ist, warum der mcl schief ist.
Und in Ihrem Fall ist es einfacher, einen Kopierkonstruktor anzugeben und Elemente in einer Zeile hinzuzufügen:
Warum ist es dasselbe? Dort gibt es automatisch einen Kopierkonstruktor und alle Manipulationen werden nachgeschaut:
Und in Ihrem Fall ist es einfacher, den Kopierkonstruktor zu setzen und Elemente mit einer Zeile hinzuzufügen
Natürlich ist es zum Beispiel eine Spielzeugklasse, in Wirklichkeit sind es auch einige Daten, wahrscheinlich eine Menge, es ist keine Option, überhaupt einen Kopierkonstruktor zu schreiben. An den richtigen Stellen in Wrapper eingewickelt und keine Notwendigkeit für einen benutzerdefinierten Konstruktor.
Es geschieht also alles trotzdem - es ist nur hinter Ihrem auto_ptr versteckt...
Ich sehe hier kein besonderes Problem.
Als abgehärteter Oldtimer mag ich den C#-Ansatz nicht, bei dem der Speicher automatisch gelöscht wird. Meiner Meinung nach sollte die Person, die die Löschung von Objekten beantragt hat, dafür verantwortlich sein, und nicht irgendein Müllsammler.
In µl können Sie auf intelligente Zeiger verzichten. Müllsammler != intelligente Zeiger, auf die man zumindest wegen der Ausnahmen nicht verzichten kann. Ich selbst mag keine Müllsammler.