[openrtm-users 00746] Re: メモリ破壊(Ver0.4.2)について
Ando Noriaki
n-ando @ aist.go.jp
2009年 1月 28日 (水) 14:04:19 JST
NECシステムテクノロジー 石田様
産総研 安藤です
ご報告ありがとうございます。
すみませんが、ご報告いただいた状況が再現できないので
もう少し詳しく状況を教えていただけないでしょうか?
> 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が呼び出されない状態となるため、このまま利用すると
> メモリの破壊を招きます。
basic_medlogbuf クラスの引数なしのコンストラクタ
basic_medlogbuf()
: __streambuf_type(), m_pLogbuf(NULL)
{
// W3C standard date and time format.
m_DateFmt = "[%Y-%m-%dT%H.%M.%S%Z]";
}
が呼ばれるということでよろしいでしょうか?
確かに、これはまずいですね。
他のコンストラクタ同様setp,setgしたほうがいいと思います。
ただ、libRTCにおいて、上記のようなコンポーネントを作成した場合でも、
このコンストラクタは呼ばれることはないような気がするのですが。
ためしに、SystemLogger.h 内コンストラクタ basic_medlogbuf() を
privateにしてみたのですが、libRTC、サンプルコンポーネントともに
コンパイルが通りました。
> 同じ構造がRTC::Managerクラスに存在するため、Managerがメモリ破壊を
> 引き起こす可能性があります。従ってManagerのログ出力を止めるために
> rtc.confに必ず以下を記載する必要があります。
> logger.enable: NO
> 以下は上記があれば不要ですが念のために指定
> logger.log_level: SILENT
というわけで、メモリ破壊が起こってると判断されるにいたった状況と、
可能ならばそのような現象が起きるサンプルをご提供いただけないでしょうか?
よろしくお願いいたします。
--
安藤慶昭@独立行政法人産業技術総合研究所 研究員
知能システム研究部門 タスクインテリジェンス研究グループ
〒305-8568 茨城県つくば市梅園1-1-1 中央第2
TEL: 029-861-5981 FAX: 029-862-6631
n-ando @ aist.go.jp, n-ando @ ieee.org
openrtm-users メーリングリストの案内