2017-10-21 1 views
1

Ich muss über etwas im folgenden Code verwechselt werden. Ich experimentiere, und konnte nicht verstehen, warum die make_shared kann nicht im Konstruktor aufgerufen werden, wo wie in initialize(), es funktioniert gutKonstruktor kann nicht verwenden make_shared <T>()

class A { 
public: 
    A() { 
     here = make_shared<A>(); 
    } 
    void initialize(){ 
//  here = make_shared<A>(); 
     cout << &*here << endl; 
     cout << &here << endl; 
    } 
    void hereAddress() { 
     cout << &*here << endl; 
    } 
private: 
    shared_ptr<A> here; 
}; 

int main(){ 
    vector<shared_ptr<A> > myA; 
    cout << "hi" << endl; 
    for (int i = 0; i < 10 ; ++i) { 
     myA.push_back(make_shared<A>()); 
    } 

    for (const auto& i : myA) { 
     i->initialize(); 
     i->hereAddress(); 
    } 
    return 0; 
} 

Als ich das laufen, bekomme ich Exit-Wert -1. Ich appreate deine Hilfe.

+8

Der Konstruktor von A verwendet make_shared, das ein neues A-Objekt erstellt, das den Aufruf von A's-Konstruktor beinhaltet ... - unendliche Wiederholung. – navyblue

+0

@navyblue das wäre eine Antwort gewesen ... Ich denke, es war eine triviale Frage an dich. Danke, – user7865286

+0

auf einen Hinweis ... Sie könnten interessiert sein an 'std :: shared_from_this' – pqnet

Antwort

0

Dies liegt daran, here = make_shared(); ist Klassenkonstruktors Aufruf und es innerhalb Konstruktor aufgerufen wird rekursiv Anrufe Segmentierung Fehler Konstruktor verursachen Wir müssen es außerhalb Konstruktor aufzurufen Compiler beschwert zu vermeiden.

+1

Der Compiler wird wahrscheinlich nicht über dieses Problem beschweren. Wahrscheinlicher wird das Programm böse, wenn Sie versuchen, es auszuführen. – aschepler

Verwandte Themen