Привет я получаю проблему Coverity как «Использование объекта Wrapper после освобождения (WRAPPER_ESCAPE) 1.. Escape: Внутреннее представление локального приветствия экранируется, но уничтожается при выходе из области» пожалуйста, помогите мне исправить это
extern const char * Helloworld()
{
std::string hello = obj->myfunction();
return hello.c_str(); // this is return to a c function
}
std::string hello = obj->myfunction();
Собирается создать строку с автоматическим хранением. Затем вы возвращаете указатель на подчиненного char*
с return hello.c_str();
, Проблема в том, что в конце функции (}
) все автоматические объекты уничтожены. Это удаляет содержимое строки, на которую вы только что передали указатель. Использование указателя в другой функции — неопределенное поведение, поскольку память была освобождена.
Если вы хотите вернуть char*
что является постоянным, то вам нужно выделить память для char*
и скопируйте строку в нее. Вы можете сделать это
с:
extern char * Helloworld()
{
std::string hello = obj->myfunction();
char * returner = new char[hello.size() + 1];
strcpy(returner, hello.c_str());
return returner;
}
При этом вызывающий должен будет удалить указатель, когда это будет сделано, иначе произойдет утечка памяти.
Вы возвращаете висячий указатель здесь, что никогда не бывает хорошо, и поэтому скрытность жалуется.
Когда вы берете c_str()
из std::string
, это не владеющий указатель базовой памяти строки. Память будет освобождена, когда std::string
разрушен, а const char *
останется болтаться
В вашем случае при выходе из функции локальная переменная hello
уничтожается, а возвращаемый указатель бесполезен.
В общем не стоит брать c_str()
кроме как в непосредственном контексте передачи чего-либо в библиотечную функцию C или, по крайней мере, это самый простой способ избежать этих проблем.