2015-01-21 3 views
-1

У меня есть два контейнера std :: map; Как удалить данные из контейнера, содержащего указатели на объекты, зная указатель (адрес)?Как найти на карте указатель?

std::map<K, CacheEntry<T>> values_; 
std::map<CacheEntry<T>*, K> timeMap_; 

Как я могу найти товар в timeMap_?

CacheEntry<T> tmp(value); 
values_.insert(std::make_pair(key, tmp)); 
timeMap_.insert(std::make_pair(&tmp, key)); 
deleteFromTimeMap(&tmp); 

И deleteFromTimeMap:

void deleteFromTimeMap(const CacheEntry<T>* findItem) 
      { 
       details::LockGuard lk(mutex_); 
       auto it = timeMap_.find(findItem); //Error 
       timeMap_.erase(it); 
      } 
+1

Так что это ошибка? Отправьте MCVE. – juanchopanza

ответ

0

карта :: Стирание может принять тип ключа, как это:

void deleteFromTimeMap(const CacheEntry<T>* findItem) 
      { 
       details::LockGuard lk(mutex_); 
       timeMap_.erase(findItem); 
      } 

см http://www.cplusplus.com/reference/map/map/erase/

и, по моему пониманию, в этом коде:

CacheEntry<T> tmp(value); 
values_.insert(std::make_pair(key, tmp)); 
timeMap_.insert(std::make_pair(&tmp, key)); 
deleteFromTimeMap(&tmp); 

вы хотите Ключ timeMap_ - это указатель на объект CacheEntry в значениях_, верно? , но поскольку std :: make_pair() и map :: insert() создает новый объект, поэтому ключ timeMap_ не указывает на объект в значениях_, вместо этого он указывает на объект stmp tmp, после того как tmp будет разрушен, введите timeMap_ это Dangling указатель, это опасно.

может быть, что вам нужно это:

CacheEntry<T> tmp(value); 
values_.insert(std::make_pair(key, tmp)); 
timeMap_.insert(std::make_pair(&values[key], key)); 
deleteFromTimeMap(&tmp); 
2

Проблема в том, ваша карта хранит неконстантные указатели, но вы пытаетесь стереть константный один. Просто удалите const с deleteFromTimeMap.

+0

Большое спасибо. –

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

  • Нет связанных вопросов^_^