繁体   English   中英

如何在地图中找到指针?

[英]How to find in map the pointer?

我有两个容器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);
            }

问题是您的地图存储了非const指针,但是您正在尝试删除一个const指针。 只需从deleteFromTimeMap签名中删除const

map :: erase可以接受密钥类型,如下所示:

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_的键是指向values_中的CacheEntry对象的指针,对吗? 但是由于std :: make_pair()和map :: insert()构造了新对象,因此timeMap_的键不指向values_中的对象,而是指向堆栈对象tmp,在tmp销毁后,timeMap_的键为悬空的指针,这很危险。

也许,您需要的是:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM