You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

存储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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.24 06:52:09