1

嗨,我收到 Coverity 问题,因为“释放后使用包装器对象 (WRAPPER_ESCAPE)1。转义:本地 hello 的内部表示转义,但在退出范围时被破坏” 请帮我修复它

extern  const char * Helloworld()
{
  std::string hello = obj->myfunction();

  return hello.c_str();   // this is return to a c function
}
4

2 回答 2

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

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

于 2015-10-05T14:25:06.630 回答
2

你在这里返回一个悬空指针,这绝不是一件好事,这就是为什么覆盖率会抱怨。

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

在您的情况下,当函数退出时,局部变量hello被破坏并且返回的指针是无用的。

通常,除非在将某些内容传递给 C 库函数的直接上下文中,否则您不应该采取c_str(),或者至少,这是避免这些问题的最直接的方法。

于 2015-10-05T14:25:57.733 回答