exit()
От: veta  
Дата: 07.11.05 11:34
Оценка:
Я не так давно начала изучать С++, поэтому мои вопросы могут показаться кому-то глупыми, но попрошу никак меня не называть, все вы когда-то и с чего-то начинали.

Вопрос:
Выполнение программы можно завершить несколькими способами, на меня сейчас интересует вызов ф-ций exit() и abort(). Разницу между ними я понимаю, но не понимаю, когда какой воспользоваться. В каких случаях нужно использовать abort()?

Страуструп пишет, что вызов exit() из деструктора может привести к бесконечной рекурсии?…- как это он так может???
class A
{
public:
   ~A() 
   {
      std::cout << "dtor" << std::endl;
      exit(0);
   }
};
int main(int, char**)
{
   A a;    
}

деструктор вызвался один раз, какая рекурсия???
Re: exit()
От: sch  
Дата: 07.11.05 11:39
Оценка:
Здравствуйте, veta, Вы писали:

V>Страуструп пишет, что вызов exit() из деструктора может привести к бесконечной рекурсии?…- как это он так может???


Вероятно Б.С. имеет в виду, что вызов exit() в деструкторе глобального объекта приведет к вызову деструктора этого объекта, который выполнит exit() и так далее.

Вот кстати что говорит по этому поводу MSDN:

When you call the exit or _exit functions, the destructors for any temporary or automatic objects that exist at the time of the call are not called. An automatic object is an object that is defined in a function where the object is not declared to be static. A temporary object is an object created by the compiler. To destroy an automatic object before calling exit or _exit, explicitly call the destructor for the object, as follows:
myObject.myClass::~myClass();

Re: exit()
От: Аноним  
Дата: 07.11.05 11:41
Оценка:
Читайте внимательно. При описании exit Бьярн ясно говорил о деструкторах глобальных объектов. В Вашем примере объект локальный
Re[2]: exit()
От: veta  
Дата: 07.11.05 12:27
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Читайте внимательно. При описании exit Бьярн ясно говорил о деструкторах глобальных объектов. В Вашем примере объект локальный


согласна, теперь объект глобальный; где обещенная рекурсия
class A
{
public:
   ~A() 
   {
      std::cout << "dtor" << std::endl;
          exit(0);
   }
};
A a;
int main(int, char**)
{    
}
Re[3]: exit()
От: Константин Россия  
Дата: 07.11.05 12:46
Оценка:
Здравствуйте, veta, Вы писали:

V>Здравствуйте, Аноним, Вы писали:


А>>Читайте внимательно. При описании exit Бьярн ясно говорил о деструкторах глобальных объектов. В Вашем примере объект локальный


V>согласна, теперь объект глобальный; где обещенная рекурсия


Из стандарта C++

3.6.1 Main function
...
If exit is called to end a program during the destruction of an object with static storage duration, the program has undefined behavior.

Re[3]: exit()
От: CiViLiS Россия  
Дата: 07.11.05 13:38
Оценка: 2 (1)
Здравствуйте, veta, Вы писали:

V>согласна, теперь объект глобальный; где обещенная рекурсия


В этом коде есть небольшая функция которая генериться компилятором и удаляет все глобальные объекты. А данном случае она выглядит вот так:
void Destruct_All_Global_Object()
{
  a.~A();
}

И "вызывается" она из закрывающейся скобки в процедуре main, а также в самом начале процедуры exit.
V>      std::cout << "dtor" << std::endl;
V>          exit(0);  <--- здесь будет вызван Destruct_All_Global_Object(), который вызовет a.~A()

Но на самом деле как это будет работать знает один только компилятор, ибо по стандарту это UB.
... << RSDN@Home 1.2.0 alpha rev. 619>>
"Бог не терпит голой сингулярности" -- Роджер Пенроуз
Re: exit()
От: vvotan Россия  
Дата: 07.11.05 17:15
Оценка:
Здравствуйте, veta, Вы писали:

V>Я не так давно начала изучать С++, поэтому мои вопросы могут показаться кому-то глупыми, но попрошу никак меня не называть, все вы когда-то и с чего-то начинали.


V>Вопрос:

V>Выполнение программы можно завершить несколькими способами, на меня сейчас интересует вызов ф-ций exit() и abort(). Разницу между ними я понимаю, но не понимаю, когда какой воспользоваться. В каких случаях нужно использовать abort()?

На мой взгляд, при изучении С++ про функции exit и abort нужно забыть. Чтобы их нормально применять нужно очень хорошо понимать что делаешь.
Хотя в одноразовом коде и сгодятся
--
Sergey Chadov

... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re: exit()
От: Андрей Коростелев Голландия http://www.korostelev.net/
Дата: 07.11.05 20:08
Оценка:
Здравствуйте, veta, Вы писали:

V>Я не так давно начала изучать С++, поэтому мои вопросы могут показаться кому-то глупыми, но попрошу никак меня не называть, все вы когда-то и с чего-то начинали.


V>Вопрос:

V>Выполнение программы можно завершить несколькими способами, на меня сейчас интересует вызов ф-ций exit() и abort(). Разницу между ними я понимаю, но не понимаю, когда какой воспользоваться. В каких случаях нужно использовать abort()?

abort() и exit() пришли из C, который был процедурным языком.
Ты же, как я прнимаю, изучаешь C++, который является в большей степени объектно-ориентированным, потому рарушать объекты желательно также в объектно-ориентированном стиле.
-- Андрей
Re: exit()
От: Павел Кузнецов  
Дата: 08.11.05 06:27
Оценка:
veta,

> Выполнение программы можно завершить несколькими способами, на меня сейчас интересует вызов ф-ций exit() и abort(). Разницу между ними я понимаю, но не понимаю, когда какой воспользоваться.


Обычно -- никакой.

> В каких случаях нужно использовать abort()?


В тонких случаях, если нужен вызов деструкторов созданных объектов (нормальное завершение), но "добираться" до выхода из main() очень долго/неудобно -- exit(), хотя стоит подумать о выбросе исключения; если вызов деструкторов противопоказан (аварийное завершение) -- abort().
Posted via RSDN NNTP Server 2.0 beta
Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
Re[4]: exit()
От: veta  
Дата: 08.11.05 17:25
Оценка:
Здравствуйте, CiViLiS.

Спасибо за ваш ответ.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.