次の .h ファイルを検討してください。
#ifndef COM_H_
#define COM_H_
#include <boost/enable_shared_from_this.hpp>
#include <boost/shared_ptr.hpp>
#include <map>
class B;
class A : public boost::enable_shared_from_this<A>{
public:
A(){}
~A(){}
void Init();
boost::shared_ptr<B> b_ptr_;
};
class B : public boost::enable_shared_from_this<B>{
public:
B(){}
B(boost::shared_ptr<A> a_ptr);
B(int j, boost::shared_ptr<A> a_ptr);
~B(){}
void Init();
void Init(boost::shared_ptr<A> a_ptr);
void Init(int j, boost::shared_ptr<A> a_ptr);
std::string b;
boost::shared_ptr<A> a_ptr_;
};
#endif /* COM_H_ */
および .cc ファイル:
#include "com.h"
void A::Init() {
// Case 1 not working
// boost::shared_ptr<B> b1(new B(shared_from_this()));
// b1->Init();
// Case 2 working
boost::shared_ptr<B> b2(new B());
b2->Init(shared_from_this());
}
B::B(boost::shared_ptr<A> a_ptr) {
B(2, a_ptr);
}
B::B(int j, boost::shared_ptr<A> a_ptr) {
a_ptr_ = a_ptr;
b = "b";
}
void B::Init() {
a_ptr_->b_ptr_ = shared_from_this();
}
void B::Init(boost::shared_ptr<A> a_ptr) {
Init(2, a_ptr);
}
void B::Init(int j, boost::shared_ptr<A> a_ptr) {
a_ptr_ = a_ptr;
b = "b";
a_ptr_->b_ptr_ = shared_from_this();
}
主に:
#include "com.h"
#include <iostream>
int main() {
boost::shared_ptr<A> a(new A());
a->Init();
std::cout << a->b_ptr_->b << std::endl;
return 0;
}
boost::shared_ptr をコンストラクターに渡してから、同じポインターを引数として別の (オーバーロードされた) コンストラクターを呼び出すと、shared_ptr が指すオブジェクトが失われ、エラーが発生します。
「boost::exception_detail::clone_impl」のインスタンスをスローした後に呼び出される終了
' what(): tr1::bad_weak_ptr
投げられます。同じ方法で 2 つのオーバーロードされた関数 (Init) を呼び出した場合、同じことは起こりません。
誰か説明してくれませんか?