Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > когда происходит уничтожение временных объектов?


Автор: korian 20.2.2010, 19:50
безопасен ли данный код с точки зрения стандарта?
Код

class A
{
public:
   A(int v) : val(v) {}
   int * getVal() {return &val;}

private:
   int val;
}

void func(int *a)
{
    (*a) = 10;
}

int main()
{
   func(A(5).getVal());
}



Автор: artsb 20.2.2010, 19:56
Да. А что смущает?

Автор: korian 20.2.2010, 20:01
смущает вот это:

   func(A(5).getVal());

можно расписать так:
Код

int *ptr;
{
   A obj(5);
   ptr = obj.getVal();
}//уничтожение объекта
func(ptr);


а вот как будет поступать компилятор по стандарту?

Автор: artsb 20.2.2010, 20:05
Цитата(korian @  20.2.2010,  20:01 Найти цитируемый пост)
можно расписать так:

нельзя.

Добавлено @ 20:06
Объект умрёт, когда функция вернёт управление.

Автор: korian 20.2.2010, 20:39
а если добавить еще одну функцию:

Код

int * func2(int *b)
{
   return b;
}

int main()
{
    func(func2(A(5).getVal()));
}


это тоже будет нормальным или уже неправильно?

Автор: artsb 20.2.2010, 20:53
Цитата(korian @  20.2.2010,  20:39 Найти цитируемый пост)
это тоже будет нормальным или уже неправильно?

нормально.

Добавлено через 2 минуты и 54 секунды
По сути, объект создаётся в main просто у него нет имени. И жить он будет до конца main (в посте выше я немного ошибся).

Автор: mes 20.2.2010, 21:04
Цитата(artsb @  20.2.2010,  19:53 Найти цитируемый пост)
И жить он будет до конца main 

не будет.

если подправить пример :
Код

int *p = func2(A(5).getVal());

то указатель p не валидный

Автор: artsb 20.2.2010, 21:08
Цитата(mes @  20.2.2010,  21:04 Найти цитируемый пост)
не будет.

Отлично работает:
Код

int *ip;
ip = func2(A(5).getVal());
*ip = 55;
Caption = IntToStr(*ip);


Добавлено через 3 минуты и 1 секунду
И вот так (хотя особой разницы нет):
Код

int *ip = A(5).getVal();
Caption = IntToStr(*ip);

Автор: mes 20.2.2010, 21:12
Цитата(artsb @  20.2.2010,  20:08 Найти цитируемый пост)

Отлично работает

и это Вы называете проверкой ?  smile  тогда я пасс  smile 

добавьте индикацию в деструктор и увидите своими глазами (если конечно компилятор нормальный) 
smile


Автор: artsb 20.2.2010, 21:14
Цитата(mes @  20.2.2010,  21:12 Найти цитируемый пост)
и это Вы называете проверкой ?

Предложите свой вариант.

Цитата(mes @  20.2.2010,  21:12 Найти цитируемый пост)
(если конечно компилятор нормальный) 

ВСВ6

Добавлено @ 21:17
mes прав  smile 
Код

// ...
   ~A() {val--;}
// ...
//---------------------------------------------------------------------------
int *ip = A(5).getVal();
Caption = IntToStr(*ip);

Выводит 4.

Добавлено @ 21:20
Значит я изначально почти правильно сказал. Когда вернёт управление внешняя функция, объект умрёт.

Автор: mes 20.2.2010, 21:30
Цитата(artsb @  20.2.2010,  20:14 Найти цитируемый пост)
Когда вернёт управление внешняя функция, объект умрёт.

 smile 

Автор: artsb 20.2.2010, 22:59
Ну вот мы и нашли согласие  smile 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)