我收到了 "Wrapper object use after free (WRAPPER_ESCAPE)" 的报道问题

I am getting coverity issuse as "Wrapper object use after free (WRAPPER_ESCAPE)"

您好,我遇到了 Coverity 问题 "Wrapper object use after free (WRAPPER_ESCAPE)1. escape: The internal representation of local hello escapes, but is destroyed when it exits scope" 请帮我解决这个问题

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();

将创建一个带有自动存储的字符串。然后你 return 一个指向底层 char*return hello.c_str(); 的指针。问题是在函数结束时 (}) 所有自动对象都被销毁了。这将删除您刚刚传递指针的字符串的内容。在另一个函数中使用指针是未定义的行为,因为内存已被释放。

如果你想 return 一个持久的 char* 那么你需要为 char* 分配内存并将字符串复制到其中。你可以这样做 与:

extern  char * Helloworld()
{
    std::string hello = obj->myfunction();
    char * returner = new char[hello.size() + 1];
    strcpy(returner, hello.c_str());
    return returner;
}

有了这个,调用者必须在用完指针后删除指针,否则会发生内存泄漏。

你在这里返回了一个悬挂指针,这从来都不是一件好事,这就是 coverity 抱怨的原因。

当您从 std::string 中获取 c_str() 时,这是字符串底层内存的 非拥有 指针。当 std::string 被销毁时,内存将被释放,而 const char * 将悬空。

在你的例子中,当函数退出时,局部变量 hello 被销毁,返回的指针无用。

一般情况下,您不应该使用 c_str(),除非是在将某些内容传递给 C 库函数的直接上下文中,或者至少,这是避免这些问题的最直接的方法。