我收到了 "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 库函数的直接上下文中,或者至少,这是避免这些问题的最直接的方法。
您好,我遇到了 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 库函数的直接上下文中,或者至少,这是避免这些问题的最直接的方法。