[openrtm-users 00745] メモリ破壊(Ver0.4.2)について
Masakazu Ishida
ishida-mxb @ necst.nec.co.jp
2009年 1月 27日 (火) 13:35:38 JST
OpenRTMユーザの皆様
NECシステムテクノロジーの石田と申します。
Ver0.4.2にてメモリ破壊に遭遇しましたので報告いたします。
原因は
basic_logstream クラスがコピーコンストラクタを宣言していない
ことに起因します。
ログ出力を停止させて回避するために0.4.2においてはrtc.confに
必ず以下を記載する必要があります。
logger.enable: NO
例:
class UserComponentClass : public RTC::DataFlowComponentBase
{
MedLogbuf m_MedLogbuf;
LogStream rtcout;
}
UserComponentClass::UserComponent(RTC::Manager* manager)
: m_MedLogbuf(manager->getMedLogbuf())
, rtcout(m_MedLogbuf)
において
basic_logstream(__filebuf_type& filebuf) コンストラクタが呼び出され
basic_medlogbuf コンストラクタが呼び出されます。次にこのオブジェクトを
メンバ変数rtcout にコピーします。このとき、 (basic_logstream クラスは
コピーコンストラクタを宣言していないので)デフォルトのコピーコンストラクタが
呼び出されるため、__ostream_type(&streambuf) ではなく__ostream_type()
(=basic_medlogbuf())が呼び出されます。このため、basic_medlogbufに
おいてsetp、setgが呼び出されない状態となるため、このまま利用すると
メモリの破壊を招きます。
同じ構造がRTC::Managerクラスに存在するため、Managerがメモリ破壊を
引き起こす可能性があります。従ってManagerのログ出力を止めるために
rtc.confに必ず以下を記載する必要があります。
logger.enable: NO
以下は上記があれば不要ですが念のために指定
logger.log_level: SILENT
以上です。
openrtm-users メーリングリストの案内