2011-01-05 5 views
0

У меня есть сообщение класса и кеш класса. В сообщении :: processMessage() fn. Я создаю экземпляр другого класса CacheRef (не показано ниже.) , затем я вызываю Cache :: cacheData (cacheRef)Сохранение локальной переменной в std :: map

Теперь, в классе Cache, у меня есть карта с ключом CacheReference. Я сохраняю ref, который я передал cacheData fn. на этой карте.

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 
} 

Теперь код работает абсолютно нормально. Но у меня есть эта проблема (не уверен !!), что я храню некоторую локальную переменную на карте, которая перестает существовать, как только processMessage() fn. выходы. Итак, могу ли я получить доступ к некоей недействительной памяти, просто удачи, что этот код работает.

Если это не так, то каков наилучший способ достичь такого поведения? У меня нет поддержки в моей системе, поэтому я не могу использовать shared_ptr для чего-либо.

+0

Ваш код пропускает параметры шаблона ... 'std :: map m_dirs' не будет работать. – etarion

+0

Можете ли вы показать, как шаблон m_dirs templatized? Является ли первый шаблон параметром CacheRef или CacheRef? –

+0

@etarion: Параметры были там, но рассматривались как HTML. Я исправил форматирование. –

ответ

2

Поскольку первый параметр шаблона является CacheRef (а не ссылкой или указателем на CacheRef), тогда ref будет скопирован на карту, когда вы вставляете. Следовательно, вы не будете хранить ссылку на локальную переменную стека.

До тех пор, пока для CacheRef существует соответствующий конструктор копирования или оператор присваивания, это будет работать нормально.

+1

Хорошо, тогда это будет оставаться до тех пор, пока класс будет существовать. поэтому нет ничего плохого в этом beahviour, если я предоставляю правильные конструкторы и операторы присваивания в классе CacheRef (так как этот класс содержит некоторые указатели) – user333422

+0

@ user333422: Да, это так. Просто убедитесь, что 'CacheRef' может быть скопирован. –

0

Как указал Стивен Дойл, вы фактически сохраняете копию карты CacheRef на карте, а не ссылку на метод, переданный методу cacheData().

Независимо от того, является ли это причиной проблемы или нет, зависит от определения класса CacheRef. Если, например, CacheRef содержит указатель или ссылку на Key, переданные конструктору, вы получите недопустимый указатель после уничтожения экземпляра Message.

Кстати, так как вы хранения динамически распределяемых объектов CacheDir в Cache::m_dirs, вы должны убедиться, что delete все значения в карте в Cache::~Cache() деструктор, чтобы избежать утечек памяти.

+0

Спасибо, да, я занимаюсь удалением, но просто задавался вопросом, пользуюсь ли я локальной переменной или нет. – user333422

Смежные вопросы