LINUX.ORG.RU

C++: Может ли программа возвращать в ОС не ноль, если в функции main явно стоит return 0;


0

0

C++: Может ли программа возвращать в ОС не ноль, если в функции main явно стоит return 0?
Может ли это быть связано с процессами, происходящими после выхода из
функции (разрущение статических объектов, вызов callback'ов atexit'а, etc...)

Пример кода
....
....
int main()
{
   ....
   ....
   try
     {
        mainObj.Run();
     }
   catch(const MyAppTerminate& e)
     { 
        // Это сообщение я в логе вижу ВСЕГДА!!!
        logg("Finished with message '%s'", e.what().c_str());
        return 0;
     }
}

Но вот в систему возвращается что-то типа -1073741819.
Не всегда конечно, но бывает.
Если сразу выходить (без полезной работы), то всегда 0 возвращется.

Скорее всего в программе у меня есть баг, но хотелось бы получить
ответ на первоначальный вопрос.

>Может ли программа возвращать в ОС не ноль, если в функции main явно стоит return 0;

может если выход произошол в другом месте.

>Но вот в систему возвращается что-то типа -1073741819.

этого не может быть. вообще. никак. вы не там смотрите возвращаемое значение.

перехватите внутри ядра sys_exit(), чтоли, и посмотрите что происходит на самом деле.

cvv ★★★★★
()
Ответ на: комментарий от Krivenok_Dmitry

>-1073741819 может быть вполне!

прочитайте стандарт языка С, ман на exit, _Exit и посмотрите на сырцы sys_exit(). ещё полазте по любимому klalafuda-ом сайту www.opengroup.org

>Если проверять через $?, то будет 5.

$? и возвращаемое значение - две вещи связанные весьма условно.

$? вполне может иметь значение -1073741819 но никакая программа на ia32 не может возврытить такого числа.

cvv ★★★★★
()
Ответ на: комментарий от cvv

да кстати запустите ваше приложение под strace. возможно плюс ко всем глюкам вы ещё гдето по памяти топчетесь

cvv ★★★★★
()
Ответ на: комментарий от cvv

извиняюсь но помоемому на тему "стандарта языка С" я переборщил

cvv ★★★★★
()

Скорее всего проблемы с памятью. Valrgind (ну или что там у вас) и вперёд.

anonymous
()

Привет.

Если Вы уверены, что исполняется "return 0" и при этом возвращается
такая хрень,то, как сказали cvv *** (*) (28.02.2006 12:25:45) и 
anonymous (*) (28.02.2006 18:07:18), это наверняка ошибка с динамической
 памятью.

У меня как-то раз, вообще, было следующие:

i=0;
if (i)
{
  printf("ok");
}

Было очень интересно наблюдать вывод на экран - "ok". :-)

Lego_12239 ★★
()
Ответ на: комментарий от Lego_12239

Function: int atexit (void (*function) (void)) The atexit function registers the function function to be called at normal program termination. The function is called with no arguments.

The return value from atexit is zero on success and nonzero if the function cannot be registered.

курим сдесь file:///usr/share/doc/glibc/libc_25.html#SEC564

bizon_art
()
Ответ на: комментарий от bizon_art

получаемое им значение никаким боком впринципе не может быть связано с atexit().

то что обработчик установленный atexit() может изменить возвращаемое значение то это правда но не до такого безобразия

cvv ★★★★★
()
Ответ на: комментарий от Lego_12239

>Как это поможет решить проблему неправильного управления динамической памятью?

bizon_art предположил что тот что-то натворил в обработчике устанавливаемом atexit();

неужто ты думаеш что там ничего нельзя сделать с динамической памятью

cvv ★★★★★
()
Ответ на: комментарий от cvv

Если так как ты говоришь, то согласен(не понял просто).

Динамическая память штука нежная, с ней надо осторожно :-)...

Lego_12239 ★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.