Приоритет оператора C ++

Допустим, у нас есть итератор (iter) над списком указателей на память, назначенный пространству кучи, если я это сделаю

delete (*iter++)

я прав, что приоритет — сначала итератор разыменования, чтобы получить адрес памяти, затем освободить место и затем увеличить итератор, чтобы освободить следующий элемент?

-2

Решение

Эффект такой, какой вы пишете, но он достигается с помощью несколько иной последовательности:

  1. Постинкремент имеет наивысший приоритет, поэтому он оценивается первым. Однако его возвращаемое значение (которое обрабатывается другими операторами) является значением iter до приращение.

  2. Разыменование вычисляется следующим, возвращая указатель, к которому не приращенное значение iter был «указывая».

  3. delete оценивается последним, а указатель удаляется.

3

Другие решения

Хотя ++ имеет более высокий приоритет, чем *, побочные эффекты постинкремента ++ применяются после оператор разыменования * использовал значение итератора. Это поведение постинкремента или суффикса ++, (в отличие от преинкремента или префикса ++). Это правило применяется как к итераторам, так и к «простым» указателям.

4

старшинство на самом деле наоборот, и если итератор имеет тип класса (с перегруженными операторами), то это порядок вызовов операторных функций:

  • Оператор приращения вызывается для увеличения итератора. Возвращает копию себя до приращение.
  • Оператор разыменования вызывается на временном итераторе и возвращает значение элемента списка, к которому iter звонил.
  • Только что возвращенный указатель удаляется, то есть объект-указатель уничтожается, а затем память освобождается.
1

Строка эквивалентна этому:

delete (*(iter++))

Но поскольку постфиксный инкремент возвращает исходное значение, вы по-прежнему разыменовываете исходное значение iter, Следовательно, если iter указывает на указатель на динамически размещенный объект, delete уничтожит этот объект. затем iter будет слева, указывая на следующий указатель вдоль.

0
По вопросам рекламы [email protected]