嗨,我收到 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
}
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()
从 a中获取时std::string
,它是字符串底层内存的非拥有指针。std::string
销毁时内存将被释放,并且const char *
将保持悬空状态。
在您的情况下,当函数退出时,局部变量hello
被破坏并且返回的指针是无用的。
通常,除非在将某些内容传递给 C 库函数的直接上下文中,否则您不应该采取c_str()
,或者至少,这是避免这些问题的最直接的方法。