0

メモリ リークが発生しました。これは、scoped_lock (Boost) の使用方法が間違っていることが原因だと思います。ただし、正確な問題を見つけることはできません。また、コードの記述方法も完全に正しくないと思います。

コードはこのクラスにあります: http://taf.codeplex.com/SourceControl/changeset/view/31767#511225

主な重要なメソッドは ThreadedLoop() です。基本的に、このメソッドはスレッド内で開始され、Yahoo 用にダウンロードされる市場データを定期的にチェックします。株式ごとに (またはそれ以外の場合)、新しいスレッドが作成され (ExecuteNextRequest() メソッド用に)、株式名を含む文字列へのポインターをパラメーターとして渡します。これは私が行う唯一のメモリ割り当てですが、スレッド実行の最後に解放されます。

また、このコードをどのように拡張できるかにも興味があります (もちろん、スレッドプールを使用することもできますが、それはまだ重要ではありません)。どうもありがとう!

4

1 に答える 1

0

への「生の」ポインタを使用する代わりに、std::stringを使用してboost::shared_ptr<std::string>それを渡すことをお勧めします。完了したら、そのreset()関数を呼び出します。使用回数を減らし、回数が 0 になると文字列を自動的に解放します。

おまけとして、boost::weak_ptrこれらの文字列にオブジェクトを取り付けて (vector多分に貼り付けることができます)、まだ「生きている」オブジェクトの数を監視できます。このようにして、何らかの理由で文字列が 0 に減らされない原因があるかどうかを知ることができます。

明確にするために:

if (_tickersQueue.size() > 0)
{
    boost::shared_ptr<std::string> ticker(new std::string(PopNextTicker()));
    if (!ticker->empty())
        _threads.create_thread(boost::bind(&TAFYahooFinanceParadigm::ExecuteNextRequest, this, ticker));
    else
        ticker.reset();  // optional; ticker will drop out of scope anyway
}

はい、関数の型をExecuteNextRequest適切に調整する必要があります。:-)

于 2009-10-08T02:07:51.747 に答える