Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> когда происходит уничтожение временных объектов? 
:(
    Опции темы
korian
Дата 20.2.2010, 19:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 651
Регистрация: 8.3.2008
Где: Украина, Харьков

Репутация: 3
Всего: 17



безопасен ли данный код с точки зрения стандарта?
Код

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());
}



PM   Вверх
artsb
Дата 20.2.2010, 19:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2280
Регистрация: 17.7.2007
Где: центр Вселенной

Репутация: 1
Всего: 64



Да. А что смущает?


--------------------
Чем отличается умный человек от мудрого?
Умный - выпутается из любой ситуации.
Мудрый - просто в неё не попадёт.
PM MAIL   Вверх
korian
Дата 20.2.2010, 20:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 651
Регистрация: 8.3.2008
Где: Украина, Харьков

Репутация: 3
Всего: 17



смущает вот это:

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

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

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


а вот как будет поступать компилятор по стандарту?
PM   Вверх
artsb
Дата 20.2.2010, 20:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2280
Регистрация: 17.7.2007
Где: центр Вселенной

Репутация: 1
Всего: 64



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

нельзя.

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

Это сообщение отредактировал(а) artsb - 20.2.2010, 23:36


--------------------
Чем отличается умный человек от мудрого?
Умный - выпутается из любой ситуации.
Мудрый - просто в неё не попадёт.
PM MAIL   Вверх
korian
Дата 20.2.2010, 20:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 651
Регистрация: 8.3.2008
Где: Украина, Харьков

Репутация: 3
Всего: 17



а если добавить еще одну функцию:

Код

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

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


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

Это сообщение отредактировал(а) korian - 20.2.2010, 20:40
PM   Вверх
artsb
Дата 20.2.2010, 20:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2280
Регистрация: 17.7.2007
Где: центр Вселенной

Репутация: 1
Всего: 64



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

нормально.

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


--------------------
Чем отличается умный человек от мудрого?
Умный - выпутается из любой ситуации.
Мудрый - просто в неё не попадёт.
PM MAIL   Вверх
mes
Дата 20.2.2010, 21:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



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

не будет.

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

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

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


--------------------
PM MAIL WWW   Вверх
artsb
Дата 20.2.2010, 21:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2280
Регистрация: 17.7.2007
Где: центр Вселенной

Репутация: 1
Всего: 64



Цитата(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);



--------------------
Чем отличается умный человек от мудрого?
Умный - выпутается из любой ситуации.
Мудрый - просто в неё не попадёт.
PM MAIL   Вверх
mes
Дата 20.2.2010, 21:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



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

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

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

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




--------------------
PM MAIL WWW   Вверх
artsb
Дата 20.2.2010, 21:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2280
Регистрация: 17.7.2007
Где: центр Вселенной

Репутация: 1
Всего: 64



Цитата(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
Значит я изначально почти правильно сказал. Когда вернёт управление внешняя функция, объект умрёт.

Это сообщение отредактировал(а) artsb - 20.2.2010, 21:21


--------------------
Чем отличается умный человек от мудрого?
Умный - выпутается из любой ситуации.
Мудрый - просто в неё не попадёт.
PM MAIL   Вверх
mes
Дата 20.2.2010, 21:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



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

 smile 


--------------------
PM MAIL WWW   Вверх
artsb
Дата 20.2.2010, 22:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2280
Регистрация: 17.7.2007
Где: центр Вселенной

Репутация: 1
Всего: 64



Ну вот мы и нашли согласие  smile 


--------------------
Чем отличается умный человек от мудрого?
Умный - выпутается из любой ситуации.
Мудрый - просто в неё не попадёт.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0914 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.