2011-01-05 5 views
0

私はクラスMessageクラスとクラスCacheを持っています。 メッセージ:: processMessage()fnにあります。私は別のクラスCacheRefのインスタンスを作成します(以下に示しません)。 次にCache :: cacheData(cacheRef)を呼び出します。std :: mapにローカル変数を格納する

ここで、Cacheクラスでは、CacheReferenceとしてキーを持つマップがあります。私はcacheData fnに渡したrefを保存します。この地図で

class Message 
{ 
private: 
Key m_key; 

public: 
    void processMessage(int a, int b, Cache *pCache) 
    { 
     CacheRef ref(a, b, m_key); //CacheRef is a class defined in same file 
     //some char *data - do processing an dfill it!! 
     pCache->cacheData(ref, data); 

    } 

} 

class Cache 
{ 
    public: 
    void cacheData(CacheRef &ref, const char* data) 
    { 
    CacheDir *dir; 
    std::map<<CacheRef, CacheDir*>::iterator it = m_dirs.find(ref); 

     if(it == m_dirs.end()) 
    { 
     dir = new CacheDir(); 
     m_dirs.insert(ref, dir); 

     } 
    } 

    std::map<CacheRef, CacheDir*> m_dirs; //CacheDir is some class defined in the same file 
} 

ここでコードは完全に正常に機能しています。しかし、私はこの懸念を持っています(確かではありません!!)、私はmapにいくつかのローカル変数を保存しています。これはprocessMessage()fnと同じようにすぐに存在しなくなります。終了します。だから、私はいくつかの無効なメモリにアクセスしています、それはちょうどこのコードが動作して運がいいですか?

これが間違っている場合は、この動作を達成する最も良い方法は何ですか? 私は自分のシステムでboostを持っていないので、何にもshared_ptrを使うことはできません。

+0

あなたのコードはテンプレートパラメータを逃しています... 'std :: map m_dirs'は動作しません。 – etarion

+0

マップm_dirsがどのようにテンプレート化されているかを表示できますか?最初のテンプレートパラメータはCacheRef&またはCacheRefですか? –

+0

@etarion:paramsはそこにありましたが、HTMLとして扱われました。私は書式を修正しました。 –

答えて

2

第1テンプレートパラメータはCacheRefであり(CacheRefへの参照またはポインタではないため)、挿入を実行するとrefがマップにコピーされます。したがって、ローカルスタック変数への参照を格納することはありません。

CacheRefに適切なコピーコンストラクタまたは代入演算子がある限り、これは正常に機能します。

+1

さて、クラスが存在する限り、これはそのままです。したがって、CacheRefクラスで適切なコピーコンストラクタと代入演算子を提供すると、このBeahviourに問題はありません(このクラスにはいくつかのポインタが含まれています)。 – user333422

+0

@ user333422:はい、そうです。 'CacheRef'がきれいにコピーできることを確認してください。 –

0

Stephen Doyleは、メソッドに渡されたものへの参照ではなく、実際にはCacheRefのコピーをマップに保存していることを指摘しています。

これが問題の原因であるかどうかは、CacheRefクラスの定義に依存します。たとえば、CacheRefがコンストラクタに渡されたKeyへのポインタまたは参照を保持している場合、インスタンスが破棄されると、無効なポインタが返されます。ところで

、あなたが Cache::m_dirsCacheDirの動的に割り当てられたオブジェクトを格納しているので、あなたはメモリリークを避けるために Cache::~Cache()デストラクタでマップ内 deleteすべての値に確認する必要があります。

+0

ありがとう、はい私は削除の世話をしていますが、私はローカル変数を使用しているかどうかは不思議に思っていた。 – user333422

関連する問題