im Konstruktor initialisiert wird ich einige Codes habe wie folgt strukturiert:Shared_ptr kann nicht, wenn `this` beteiligt
#include <memory>
#include <vector>
using namespace std;
struct demo {
vector<shared_ptr<demo>> foo{shared_ptr<demo>(this)};
void append(){
foo.push_back(make_shared<demo>());
}
};
demo dummy(/* accept some arguments */){
demo a{};
a.append();
return a;
}
int main()
{
demo bar=dummy();
return 0;
}
Die Dummy-Funktion nur einen Prozess tun auf der Grundlage seiner Argumentation auf einer neuen Demo-Instanz aufgebaut und es zurück. (ich bin mir ziemlich sicher, dass die oben genug ist, um das Problem zu belichten)
Es kompiliert und ohne Fehler, aber es wird nicht selbst beenden. (Ich verwende g ++ von MinGW auf Win7).
Dann versuche ich zu arbeiten. Ich habe einen Kopierkonstruktor (sowie einen expliziten Standardkonstruktor) hinzugefügt und dann new
verwendet, um nur einen Zeiger auf demo in der Hauptfunktion zu behalten. So wird der Code etwas wie sein:
...
struct demo {
vector<shared_ptr<demo>> foo {shared_ptr<demo>(this)};
void append() {
foo.push_back(make_shared<demo>());
}
demo(){
};
demo(const demo& instance): foo(instance.foo) {
}
};
...
int main()
{
// demo bar=dummy();
demo* bar=new demo(dummy());
delete bar;
return 0;
}
Dann hat es einfach funktioniert. Aber ich frage mich immer noch nach dem Mechanismus hinter diesen Linien. Würden Sie einfach erklären, was der Unterschied zwischen der new
konstruierten und normal deklarierten Variablen ist?
EDIT: So endlich ist es überhaupt zu push_back
this
in einen Vektor als struct Mitglied in seinem Konstruktor? (Aus dem Grunde, ist es, weil der Rest meines Vektor speichert all shared_ptr
mit Ausnahme des ersten, in anderen Worten, selbst wenn der Vektor pop_back
ed ist leer zu sein, ist es noch this
zurückkehren kann)
'bar' wird nicht automatisch gelöscht:' demo * bar = neues demo (dummy()); 'es leckt. –
Sie sollten 'shared_ptr (this)' vermeiden (da Sie keine Garantie haben, dass Sie 'this' vorher besitzen), könnte 'enable_shared_from_this' helfen. –
Jarod42
Sie können kein Objekt annehmen, das ausschließlich einem anderen gehört, und entscheiden, dass es geteilt werden soll. Teilen muss eine gegenseitige Vereinbarung sein oder Dinge können ernsthaft schief gehen. – molbdnilo