【问题标题】:c++ map element insertionc++ 地图元素插入
【发布时间】:2013-09-26 13:43:00
【问题描述】:

我想在地图中插入一个指向对象的指针。这是正确的方法吗?

object myobject[10];
....
mymap.insert( std::pair<int,object*>(pktctr, &myobject[pktctr]));

【问题讨论】:

  • 是的,如果您想测试您的平台在未定义行为的情况下会做什么,这是正确的方法
  • @BЈовић:未定义的行为在哪里?只要pktctr 在范围内并且在myobject 被销毁之前删除指针,它对我来说看起来不错。我错过了什么吗?
  • @MikeSeymour 这是很多假设 :) 我假设 myobject 在方法的堆栈中,并且它超出了范围

标签: c++ map insertion


【解决方案1】:

这是正确的方法吗?

是的,尽管如果您使用make_pair 可能会更好读:

mymap.insert(std::make_pair(pktctr, &myobject[pktctr]));

或 C++11 语法:

mymap.insert({pktctr, &myobject[pktctr]});

唯一的危险是您必须确保在销毁myobject 之前删除指针或销毁映射(或者至少确保在此之后不再使用指针)。否则,您将有一个悬空指针和一大堆等待发生的错误。

【讨论】:

  • 在myobject被销毁之前清除析构函数中的map可以吗?
  • @AvbAvb:是的:唯一的危险是如果你在对象被销毁之后使用指针。
【解决方案2】:

只要满足以下条件之一,这将有效且正确(即不会导致未定义的行为):

  • mymapmyobject 具有相同的生命周期(它们被声明在相同的范围内):您将确定映射比数组更持久
  • 指针在 myobject 生命周期结束之前被删除(你会有一个悬空指针,一个指向不再存在的东西的指针)

确保pktctr 永远不会超过数组的末尾。

最后,这个语法也可以工作:

mymap[pktctr] = &myobject[pktctr];

编辑:

其实我是在myobject被销毁之前清除析构函数中的map。

那么你不应该有任何悬空指针问题 AFAIK。

【讨论】:

    猜你喜欢
    • 2013-12-30
    • 2013-10-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多