1
は、我々は次のように定義されたクラスはFooを持って言う:shared_from_this()を渡すとセグメント違反が発生するのはなぜですか?
// foo.hpp
class Foo;
using FooCallback = std::function<void(std::shared_ptr<Foo> ins)>;
class Foo : public std::enable_shared_from_this<Foo>{
public:
Foo(int b, const FooCallback& callback):m_bar(b),
m_callback(callback){}
int
getBar();
void
doSth();
private:
int m_bar;
const FooCallback& m_callback;
};
なぜ以下のコード原因セグメントの障害だろうか?
// foo.cpp
#include "foo.hpp"
int
Foo::getBar(){
return m_bar;
}
void
Foo::doSth(){
std::cout << "Start ... " << std::endl;
this->m_callback(shared_from_this());
std::cout << "End ... " << std::endl;
}
int main()
{
auto f = std::make_shared<Foo>(100,
[](std::shared_ptr<Foo> ins){
std::cout << "bar: " << ins->getBar() << std::endl;
});
f->doSth();
return 0;
}
出力は次のようになります。
スタート...
セグメンテーションフォールト
私の理解するには、これは何が起こっているかである。
- main()、
f
はFooのインスタンスを指しているshared_ptrです。たとえば、ins
となります。 f->doSth()
が呼び出されると、ins.doSth()
が実際に呼び出されます。- ins.doSthでは、
this
はins
へのポインタです。shared_from_this()
はins
のshared_ptrです。
なぜ、ステップ3でセグメント障害が発生していますか?
ありがとうございます。私はこれらのコンセプトが本当に混乱しているのを発見私はこれを尋ねるべきではないかもしれないが、現代のC++を学ぶ上でいくつかの読書を勧めてくれるだろうか? – stupidlearner
私はC++の本を読んでいないので、私は個人的には何も推奨できませんが、[this](http://stackoverflow.com/q/388242/3425536)をチェックしてください。 – emlai