-2

假设我们在分配给堆空间的内存指针列表上有一个迭代器(iter),如果我这样做的话

delete (*iter++)

我的优先级是首先取消引用迭代器以获取内存地址然后释放空间然后递增迭代器以释放下一个元素,这是对的吗?

4

4 回答 4

4

尽管++具有比 更高的优先级*,但后增量的副作用++是在取消引用运算符*使用了迭代器的值之后应用的。这是后增量或后缀的行为++(与前增量或前缀相反++)。此规则适用于迭代器以及“普通”指针。

于 2013-03-08T13:38:49.427 回答
3

效果如您所写,但使用稍微不同的顺序实现:

  1. 后增量具有最高优先级,因此首先对其进行评估。但是,它的返回值(由进一步的运算符处理)是增量iter 之前的值。

  2. 接下来评估取消引用,返回未递增值iter“指向”的指针。

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

于 2013-03-08T13:42:08.673 回答
1

优先级实际上是相反的,如果迭代器是类类型(带有重载运算符),这是对运算符函数的调用顺序:

  • 调用递增运算符来递增迭代器。它在增量之前返回自身的副本。
  • 在临时迭代器上调用解引用运算符并返回iter用于调用的列表项的值。
  • 刚刚返回的指针被删除,即指向的对象被破坏,然后内存被释放。
于 2013-03-08T13:45:49.587 回答
0

该行等效于:

delete (*(iter++))

但是由于后缀增量返回原始值,您仍然取消引用iter. 因此,如果iter指针指向一个动态分配的对象,delete就会销毁该对象。然后iter将左指针指向下一个指针。

于 2013-03-08T13:40:53.900 回答