Я не так давно начала изучать С++, поэтому мои вопросы могут показаться кому-то глупыми, но попрошу никак меня не называть, все вы когда-то и с чего-то начинали.
Вопрос:
Выполнение программы можно завершить несколькими способами, на меня сейчас интересует вызов ф-ций exit() и abort(). Разницу между ними я понимаю, но не понимаю, когда какой воспользоваться. В каких случаях нужно использовать abort()?
Страуструп пишет, что вызов exit() из деструктора может привести к бесконечной рекурсии?…- как это он так может???
class A
{
public:
~A()
{
std::cout << "dtor" << std::endl;
exit(0);
}
};
int main(int, char**)
{
A a;
}
Здравствуйте, 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 Бьярн ясно говорил о деструкторах глобальных объектов. В Вашем примере объект локальный
Здравствуйте, Аноним, Вы писали:
А>Читайте внимательно. При описании exit Бьярн ясно говорил о деструкторах глобальных объектов. В Вашем примере объект локальный
согласна, теперь объект глобальный; где обещенная рекурсия
class A
{
public:
~A()
{
std::cout << "dtor" << std::endl;
exit(0);
}
};
A a;
int main(int, char**)
{
}
Здравствуйте, 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.
Здравствуйте, veta, Вы писали:
V>Я не так давно начала изучать С++, поэтому мои вопросы могут показаться кому-то глупыми, но попрошу никак меня не называть, все вы когда-то и с чего-то начинали.
V>Вопрос: V>Выполнение программы можно завершить несколькими способами, на меня сейчас интересует вызов ф-ций exit() и abort(). Разницу между ними я понимаю, но не понимаю, когда какой воспользоваться. В каких случаях нужно использовать abort()?
На мой взгляд, при изучении С++ про функции exit и abort нужно забыть. Чтобы их нормально применять нужно очень хорошо понимать что делаешь.
Хотя в одноразовом коде и сгодятся
Здравствуйте, veta, Вы писали:
V>Я не так давно начала изучать С++, поэтому мои вопросы могут показаться кому-то глупыми, но попрошу никак меня не называть, все вы когда-то и с чего-то начинали.
V>Вопрос: V>Выполнение программы можно завершить несколькими способами, на меня сейчас интересует вызов ф-ций exit() и abort(). Разницу между ними я понимаю, но не понимаю, когда какой воспользоваться. В каких случаях нужно использовать abort()?
abort() и exit() пришли из C, который был процедурным языком.
Ты же, как я прнимаю, изучаешь C++, который является в большей степени объектно-ориентированным, потому рарушать объекты желательно также в объектно-ориентированном стиле.
veta,
> Выполнение программы можно завершить несколькими способами, на меня сейчас интересует вызов ф-ций exit() и abort(). Разницу между ними я понимаю, но не понимаю, когда какой воспользоваться.
Обычно -- никакой.
> В каких случаях нужно использовать abort()?
В тонких случаях, если нужен вызов деструкторов созданных объектов (нормальное завершение), но "добираться" до выхода из main() очень долго/неудобно -- exit(), хотя стоит подумать о выбросе исключения; если вызов деструкторов противопоказан (аварийное завершение) -- abort().
Posted via RSDN NNTP Server 2.0 beta
Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен