2013-03-08 210 views
-2

比方说,我们有超过分配给堆空间内存指针列表的迭代器(ITER),如果我这样做C++运算符优先级

delete (*iter++) 

我是正确的优先级是第一个提领迭代器取得内存地址然后释放空间,然后增加迭代器释放下一个元素?

+0

不要编写需要太多的代码,但要弄清楚发生了什么 - 最好将其分散到几行。这样你可以防止现在或将来的错误。 – 2013-03-08 13:47:34

+0

为了确保我能理解幕后发生的事情...... – user1845360 2013-03-08 13:56:30

回答

3

的效果是你写的,但它使用一个稍微不同的顺序来实现:

  1. 的后递增具有最高的优先级,所以它的第一评价。但是,其返回值(由其他运营商处理)的值为iter之前的的增量。

  2. 下一步评估解除引用,返回iter未增加的值“指向”的指针。

  3. delete最后被评估,指针被删除。

4

虽然++ has higher precedence than *,后期增量++的副作用后应用的引用操作*采用了迭代器的值。这是后增量行为,或后缀++(与预增量相反,或前缀++)。这条规则适用于迭代器以及“普通”指针。

0

该生产线是相同的:

delete (*(iter++)) 

但由于后缀增量返回原来的价值,你还在提领的iter原始值。因此,如果iter指向指向动态分配对象的指针,则delete将销毁该对象。然后iter会一直指向下一个指针。

1

优先实际上是反向,并且如果所述迭代器类型(带重载操作符)的,这是调用给操作者功能的顺序:

  • 递增运算符是调用增加迭代器。它返回本身的副本之前的增量。
  • 在临时迭代器上调用解引用运算符,并返回iter用于调用的列表项的值。
  • 刚刚返回的指针被删除,即指向的对象被破坏,然后释放内存。