Я получаю сообщение об ошибке в качестве & quot; Использование объекта Wrapper после освобождения (WRAPPER_ESCAPE) & quot;

Привет я получаю проблему 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
}

1

Решение

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;
}

При этом вызывающий должен будет удалить указатель, когда это будет сделано, иначе произойдет утечка памяти.

3

Другие решения

Вы возвращаете висячий указатель здесь, что никогда не бывает хорошо, и поэтому скрытность жалуется.

Когда вы берете c_str() из std::string, это не владеющий указатель базовой памяти строки. Память будет освобождена, когда std::string разрушен, а const char * останется болтаться

В вашем случае при выходе из функции локальная переменная hello уничтожается, а возвращаемый указатель бесполезен.

В общем не стоит брать c_str() кроме как в непосредственном контексте передачи чего-либо в библиотечную функцию C или, по крайней мере, это самый простой способ избежать этих проблем.

2