2017-10-21 19 views
1

次のコードでは、何かについて間違えています。私はこれを実行すると、私は終了コードを取得-1 コンストラクターでは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; 
} 

試した、と make_sharedはコンストラクタで呼び出すことができない理由を理解することができませんでした、 initialize()のように、それが正常に動作どこ。私はあなたの助けを肯定します。

+8

Aのコンストラクタは、Aのコンストラクタを呼び出すことを含む新しいAオブジェクトを作成するmake_sharedを使用します。 - 無限回帰。 – navyblue

+0

@navyblueこれは答えだったでしょう...私はそれがあなたにとって些細な疑問だったと思います。ありがとう – user7865286

+0

注...あなたは 'std :: shared_from_this'に興味があるかもしれません – pqnet

答えて

0

here = make_shared();は、クラスのコンストラクタ を呼び出し、コンストラクタ内でそれを呼び出しているので、これは私たちは、コンパイラが文句を避けるために外部のコンストラクタを呼び出す必要があり セグメンテーションフォールトを引き起こし、コンストラクタへの再帰呼び出しを行います。

+1

コンパイラはおそらくこの問題については不平を言わないでしょう。あなたがそれを実行しようとすると、プログラムが厄介な行為をする可能性が高くなります。 – aschepler

関連する問題