В BEA Tuxedo имеет смысл вызывать tpfree после tpreturn? - PullRequest
0 голосов
/ 07 мая 2018

Я слишком часто вижу это в кодовой базе, в которой я сейчас работаю:

int obtained_number = 5;
char *answer = tpalloc(15);
sprintf(answer, "num:%d", obtained_number);
tpreturn(TPSUCCESS, 0, answer, answerSize, 0);
tpfree(answer);//why?

Согласно документации :

tpreturn () действует как оператор return на языке C (то есть, когда вызывается tpreturn (), служебная подпрограмма возвращается диспетчеру системы BEA Tuxedo).

Если это так, то, я думаю, служба завершается в этот момент, и tpfree() никогда не вызывается. Когда служба вызывается снова, она снова запускается в методе main вместо того, где выполнение завершилось в прошлый раз.

Это правильно? Должен ли я сообщить об этом ненужном использовании tpfree()?

1 Ответ

0 голосов
/ 08 мая 2018

tpreturn () фактически выполняет longjmp (), и после выполнения tpreturn () код отсутствует. Когда сервис вызывается снова, он запускается с начала сервисной функции.

В вашем случае это означает, что tpfree () никогда не выполняется и не должен - tpreturn () заботится о буфере, который вы ему передаете (освобождает, кэширует для следующего вызова и т. Д.)

Что хуже для кода C ++

std::string obtained_str = "5";
char *answer = tpalloc(15);
sprintf(answer, "str:%s", obtained_str.c_str());
tpreturn(TPSUCCESS, 0, answer, answerSize, 0);

Деструктор для полученный_стр не будет вызван, и у вас будет утечка памяти.

...