2016-11-16 7 views
1

私は、ベクターに自分自身へのスマートポインタをプッシュすることができますクラスを実装しようとしています:にベクトル結果にshared_ptrの(これを)押す「)(フリー:無効なポインタ」エラー

#include <memory> 
#include <vector> 

class A { 
public: 
    void pushme(std::vector<std::shared_ptr<A>> & vec) { 
     vec.push_back(std::shared_ptr<A>(this)); 
    } 
}; 

int main() { 
    A test; 
    std::vector<std::shared_ptr<A>> vec; 
    test.pushme(vec); 
    return 0; 
} 

これがうまくコンパイルしかし、実行時に私はfree(): invalid pointerエラーが発生します。ここで何が起こっているのか理解してください。

答えて

2

enable_shared_from_thisをお試しください:

class A : public std::enable_shared_from_this<A>{ 
public: 
    void pushme(std::vector<std::shared_ptr<A>> & vec) { 
     vec.push_back(shared_from_this()); 
    } 
}; 

int main() 
{ 
    std::shared_ptr<A> test = std::make_shared<A>(); 
    std::vector<std::shared_ptr<A>> vec; 
    test->pushme(vec); 
    return 0; 
} 
7
A test; 

これは、関数ローカルスコープ内のオブジェクトを宣言します。スコープから外れると、オブジェクトは自動的に解放されます。 (newで作成された)動的範囲における

オブジェクトのみがstd::shared_ptrによって管理することができます。それはstd::shared_ptrの全体の目的です - オブジェクトへの最後の共有ポインタがなくなったときに自動的にdeleteを呼び出すこと。 newで割り当てられたものはdeleteにしかなりません。

一方
+1

、そのオブジェクトを解放する責任がありdeleter'あなたは理論的には '自動メモリに保存されているオブジェクトを指すshared_ptr'インスタンスを持っていると' DELETE'を持っていませんでしたので、 'shared_ptr'は、'カスタムを保持することができますすべての 'shared_ptr'インスタンスがスコープから外れたときにオブジェクトに対して呼び出されます。あなたはこれをするべきではありませんが、あなたはそれをすることができます。 –

関連する問題