私は g++ でビルドしていますが、昨日、SO の親切な人から-D_GLIBCXX_DEBUG
and-D_GLIBCXX_DEBUG_PEDANTIC
フラグでコンパイルするように言われました。私はそうし、昨日のほとんどをこれらのフラグに準拠するようにコードを微調整することに費やしました。の使用について不平を言っていますがboost::signal
、どこに問題があるのか わかりません。
別のクラスのシグナルにバインドしたいYarl
関数を持つクラスがあります:refresh()
sigRefresh
EventHandler
class Yarl
{
private:
void refresh();
(...)
};
class EventHandler
{
public:
boost::signal<void()> sigRefresh;
(...)
}
次に、のメンバー関数にはYarl
、次のコードがあります。
EventHandler eventHandler;
eventHandler.sigRefresh.connect(boost::bind(&Yarl::refresh, this));
これらのフラグを使用してコンパイルを開始する前は、このコードは問題なく動作していました。それらを使用するようになったので、私のプログラムは 2 行目でセグメンテーション違反を起こします。
gdb からのバックトレースは次のとおりです。
#0 0x001eeee6 in __gnu_debug::_Safe_iterator_base::_M_detach_single() ()
from /usr/lib/libstdc++.so.6
#1 0x001f0555 in __gnu_debug::_Safe_sequence_base::_M_detach_all() ()
from /usr/lib/libstdc++.so.6
#2 0x0804e8a3 in ~_Safe_sequence_base (this=0x812cda4,
__in_chrg=<value optimized out>)
at /usr/include/c++/4.4/debug/safe_base.h:180
#3 0x08085af9 in __gnu_debug::_Safe_sequence<std::__debug::vector<boost::signals::trackable const*, std::allocator<boost::signals::trackable const*> > >::~_Safe_sequence() ()
#4 0x08085b44 in std::__debug::vector<boost::signals::trackable const*, std::allocator<boost::signals::trackable const*> >::~vector() ()
#5 0x080873ab in boost::signals::detail::slot_base::data_t::~data_t() ()
#6 0x080873e3 in void boost::checked_delete<boost::signals::detail::slot_base::data_t>(boost::signals::detail::slot_base::data_t*) ()
#7 0x0808802e in boost::detail::sp_counted_impl_p<boost::signals::detail::slot_base::data_t>::dispose() ()
#8 0x08083d04 in boost::detail::sp_counted_base::release (this=0x812ce30)
at /usr/local/boost/smart_ptr/detail/sp_counted_base_gcc_x86.hpp:145
#9 0x08083d76 in ~shared_count (this=0xbffff358,
__in_chrg=<value optimized out>)
at /usr/local/boost/smart_ptr/detail/shared_count.hpp:217
#10 0x08083f70 in ~shared_ptr (this=0xbffff354,
__in_chrg=<value optimized out>)
at /usr/local/boost/smart_ptr/shared_ptr.hpp:169
#11 0x080847f1 in ~slot_base (this=0xbffff354, __in_chrg=<value optimized out>)
at /usr/local/boost/signals/slot.hpp:27
#12 0x08084829 in ~slot (this=0xbffff354, __in_chrg=<value optimized out>)
at /usr/local/boost/signals/slot.hpp:105
#13 0x0808390f in yarl::Yarl::mainLoop (this=0xbffff3dc) at src/Yarl.cpp:408
#14 0x08083a96 in yarl::Yarl::startGame (this=0xbffff3dc) at src/Yarl.cpp:452
#15 0x08083abe in main () at src/Yarl.cpp:461
私が何を修正すべきか誰にもわかりますか?
編集: Daniel Trebbien が提案したように、問題を説明する小さなサンプル プログラムがあります。
ヘッダー ファイル (test.hpp) は次のとおりです。
#include <boost/bind.hpp>
#include <boost/signal.hpp>
#include <iostream>
#include <tr1/memory>
namespace yarl
{
class Yarl
{
private:
void refresh();
public:
void hookSignal();
};
namespace events
{
class EventHandler
{
public:
boost::signal<void()> sigRefresh;
};
}
}
実装は次のとおりです。
#include "test.hpp"
using namespace std;
namespace yarl
{
void Yarl::refresh()
{
cout << "in refresh" << endl;
}
void Yarl::hookSignal()
{
events::EventHandler eventHandler;
eventHandler.sigRefresh.connect(boost::bind(&Yarl::refresh, this));
eventHandler.sigRefresh();
}
}
int main()
{
yarl::Yarl y;
y.hookSignal();
}
前と同様に、このサンプル プログラムは g++ で-g
フラグのみを使用してコンパイルすると正常に動作しますが、 and を追加する-D_GLIBCXX_DEBUG
と-D_GLIBCXX_DEBUG_PEDANTIC
、その行で segfault が発生しeventHandler.sigRefresh.connect
ます。
Boost を-D_GLIBCXX_DEBUG
and-D_GLIBCXX_DEBUG_PEDANTIC
で再コンパイルしましたが、問題は解決しませんでしたが、コンパイル中に奇妙なことをしていることに気付きました。このコマンドを使用して bjam でコンパイルしました (このブースト チュートリアルによると):
sudo bjam --build-dir=. --toolset=gcc --variant=debug --cxxflags=-D_GLIBCXX_DEBUG,-D_GLIBCXX_DEBUG_PEDANTIC --layout=tagged stage
タグにもかかわらず、--variant=debug
まだリリース バージョンをコンパイルしていました。また、出力のどこにもデバッグ フラグについての言及はありませんでした。間違ってコンパイルした可能性はありますか?