一週間以上の戦い。

derok
記事: 51
登録日時: 12年前

一週間以上の戦い。

投稿記事 by derok » 11年前

いやまさかこんなに苦しめられるとは・・・・
スマートポインタが循環参照していて、メモリリークしていたんですよ。

CODE:

//こんな感じ
class B;
class A{
    SharedPtr Ptr;
};
class B{
    SharedPtrPtr;
};
そのことに気付くのに二日くらいかかったんですが・・問題はその後で・・・
結構ややこしいところだったので、それを解決するのに六日ほど・・・・
合計一週間以上苦しめられました・・・・
今日やっと解決したんですが、「よっしゃー!!」って叫びそうになりましたよ。
ヘッダーファイルに循環参照にも苦しめられましたし、
分かりにくいこのバグは厄介ですね・・・

ISLe
記事: 2650
登録日時: 14年前

Re: 一週間以上の戦い。

投稿記事 by ISLe » 11年前

スマートポインタはスマートポインタをコピーしないとダメなんですよね。
スマートポインタに限らずテンプレートライブラリは遍くそういうふうなのでうっかり生ポインタに触れると破綻するコードになりがちです。

YuO
記事: 947
登録日時: 14年前

Re: 一週間以上の戦い。

投稿記事 by YuO » 11年前

弱参照をうまく使わないと循環するのはわかっていても,弱参照をどこに使うかは悩ましいですよね。
強参照のスマートポインタは透過ですが,弱参照のスマートポインタは透過ではないですから。
# 弱参照は無効化される可能性があるため。std::weak_ptrならlockの戻り値確認が必要。

GC組み込み言語でも参照カウント式GCだと循環参照が発生しますね。
PHP 5.2までが参照カウントのみで,弱参照もないという面倒な作りになっています。
# 5.3から循環参照を検知するアルゴリズムが有効になっています (php.iniで無効化可能)。

derok
記事: 51
登録日時: 12年前

Re: 一週間以上の戦い。

投稿記事 by derok » 11年前

返信おくれてすいません。
>>ISLeさん
スマートポインタはスマートポインタにしかコピーしてはいけないというこですか?
それならしっかりとしています。
>>Yuoさん
そうなんですよね・・・
設計の時に気付いていればまだマシなんですが・・・