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);
Деструктор для полученный_стр не будет вызван, и у вас будет утечка памяти.