Порядок выполнения деструкторов
От: Ash-2 Россия  
Дата: 10.05.06 12:48
Оценка:
Собственно сабж...
Можно ли предсказать порядок разрушения объектов в следующей функции:
void Func(int i, float f)
{
  int k;
  RECT rct;
  int* pI;

  //что-то происходит...
}


Перед выходом из функции, у нас "разрушаются" следующие "объекты":
i, f, k, rct, pI
Порядок их "разрушения" произволен (== зависит от компилятора, оптимизации) или прописан стандартом?

P.S. Нужно следующее: pI является указателем на "k" и при "разрушении" должен читать текущее значение (естественно на месте pI — класс с деструктором... да и "k" — тоже в общем случае — класс... но, это сути вопроса не меняет)
Re: Порядок выполнения деструкторов
От: Bell Россия  
Дата: 10.05.06 13:27
Оценка: 11 (3)
Здравствуйте, Ash-2, Вы писали:

A2>Порядок их "разрушения" произволен (== зависит от компилятора, оптимизации) или прописан стандартом?



6.6/2
On exit from a scope (however accomplished), destructors (12.4) are called for all 
constructed objects with automatic storage duration (3.7.2) (named objects or temporaries)
that are declared in that scope, in the reverse order of their declaration.
...
Любите книгу — источник знаний (с) М.Горький
Re[2]: Порядок выполнения деструкторов
От: Ash-2 Россия  
Дата: 10.05.06 15:26
Оценка:
Здравствуйте, Bell, Вы писали:

B>
B>6.6/2
B>On exit from a scope (however accomplished), destructors (12.4) are called for all 
B>constructed objects with automatic storage duration (3.7.2) (named objects or temporaries)
B>that are declared in that scope, in the reverse order of their declaration.
B>...
B>


а параметры функций попадают под named objects or temporaries ?
Re[3]: Порядок выполнения деструкторов
От: Bell Россия  
Дата: 10.05.06 16:16
Оценка: 30 (2)
Здравствуйте, Ash-2, Вы писали:


A2>а параметры функций попадают под named objects or temporaries ?


Туь все не так просто.
Во первых:
5.2.2/4
...
The initialization and destruction of each parameter occurs
within the context of the calling function.
...

Так что фраза из твоего первого поста

Перед выходом из функции, у нас "разрушаются" следующие "объекты":
i, f, k, rct, pI

неверна по отношение к i и f.

Во-вторых, тот же самый 5.2.2, стих 8:
The order of evaluation of arguments is unspecified.
...


Так что не стоит полагаться на порядок инициализации/разрушения аргументов функций.
Любите книгу — источник знаний (с) М.Горький
Re[4]: Порядок выполнения деструкторов
От: jazzer Россия Skype: enerjazzer
Дата: 10.05.06 17:09
Оценка: 1 (1)
Здравствуйте, Bell, Вы писали:

B>Во-вторых, тот же самый 5.2.2, стих 8:

B>
B>The order of evaluation of arguments is unspecified.
B>...
B>


B>Так что не стоит полагаться на порядок инициализации/разрушения аргументов функций.


Не уверен, что можно применять к параметрам (1.3.9) слова, относящиеся к аругментам (1.3.1).
Есть определенная разница между параметрами и аргументами. Параметры — это объекты, использующиеся внутри функции, а аргументы — это выражения, с которыми функция вызвана, т.е. аргументы — это инициализаторы параметров. Соответственно, порядок вычисления аргументов-инициализаторов никак не влияет на порядок инициализации параметров.

Так что, я думаю, параметры все же будут разрушаться в порядке, обратном порядку их объявления.
Хотя явного прояснения я в Стандарте не нашел, и в дефекты не смотрел, ибо домой пора
jazzer (Skype: enerjazzer) Ночная тема для RSDN
Автор: jazzer
Дата: 26.11.09

You will always get what you always got
  If you always do  what you always did
Re[5]: Порядок выполнения деструкторов
От: MuTPu4  
Дата: 10.05.06 22:43
Оценка: 28 (4)
Здравствуйте, jazzer, Вы писали:

J>Не уверен, что можно применять к параметрам (1.3.9) слова, относящиеся к аругментам (1.3.1).

J>Есть определенная разница между параметрами и аргументами. Параметры — это объекты, использующиеся внутри функции, а аргументы — это выражения, с которыми функция вызвана, т.е. аргументы — это инициализаторы параметров. Соответственно, порядок вычисления аргументов-инициализаторов никак не влияет на порядок инициализации параметров.
Тем не менее, стандарт не содержит никаких гарантий относительно порядка инициалдизации параметров.

J>Так что, я думаю, параметры все же будут разрушаться в порядке, обратном порядку их объявления.

J>Хотя явного прояснения я в Стандарте не нашел, и в дефекты не смотрел, ибо домой пора
Порядок разрушения — это уже другой вопрос. На эту тему есть open core issue #276.
На практике, после запуска такого примера:
#include <cstdio>

struct test1
{
  test1( ) : copy_( false ) {}

  test1( const test1 & ) : copy_( true ) {}

  ~test1( )
  {
    if( copy_ )
      ::std::printf( "1" );
  }

  int copy_;
};

struct test2
{
  test2( ) : copy_( false ) {}

  test2( const test2 & ) : copy_( true ) {}

  ~test2( )
  {
    if( copy_ )
      ::std::printf( "2" );
  }

  int copy_;
};

void foo( test1 , test2 )
{
}

int main()
{
  test1 t1;
  test2 t2;

  foo( t1, t2 );
}

можно получить:

Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 13.10.3077 for 80x86
12
Intel(R) C++ Compiler for 32-bit applications, Version 8.1
21
gcc version 3.4.2 (mingw-special)
21
Digital Mars Compiler Version 8.42n
21
Borland C++ 5.5 for Win32
12

То есть порядок разрушения объектов не для всех реализаций соответствует обратному порядку их объявления в функции.
Re[6]: Порядок выполнения деструкторов
От: jazzer Россия Skype: enerjazzer
Дата: 11.05.06 08:49
Оценка:
Здравствуйте, MuTPu4, Вы писали:

J>>Хотя явного прояснения я в Стандарте не нашел, и в дефекты не смотрел, ибо домой пора

MTP>Порядок разрушения — это уже другой вопрос. На эту тему есть open core issue #276.

Ага, оно, спасибо!
Посмотрим, что решат в результате
jazzer (Skype: enerjazzer) Ночная тема для RSDN
Автор: jazzer
Дата: 26.11.09

You will always get what you always got
  If you always do  what you always did
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.