存储std::map键指针为对应值时的有效性安全性问询
问题描述
struct ndptr_t { const pnode *ptr; ndptr_t(const pnode* _p = nullptr) : ptr(_p) {} ~ndptr_t() { // if no ndptr_t used outside map nid, clear nid } }; static std::map<pnode, ndptr_t> nid; pnode* ptrof(pnode &pn) { auto r = nid.emplace( pn, ndptr_t(nullptr) ); if (r.second) r.first->second = ndptr_t(&(r.first->first)); return r.first->second; }
上述代码试图将std::map中键的指针作为对应键的值存储。请问:在map nid的生命周期内,只要对应键未被移除或删除,是否可安全认为这些指向键的指针始终有效?我已实现该代码且运行正常。
解答
- 可以安全认为这些指针始终有效。
std::map基于红黑树实现,它的特性是:在容器生命周期内,已存在的元素(键值对)只要不被删除或移除,其内存地址就不会发生改变。红黑树进行结构调整时,只会修改节点间的指针关联,不会移动节点本身的存储位置。- 你通过
&(r.first->first)获取的是map中键对象的内存地址,只要该键对应的元素一直存在于map中,这个地址就始终有效,可安全使用。
内容的提问来源于stack exchange,提问作者U J
相关产品推荐
相关产品推荐

