我正在得到掩护性 issuse 作为"Wrapper object use after free (WRAPPER_ESCAPE)"
I am getting coverity issuse as "Wrapper object use after free (WRAPPER_ESCAPE)"
嗨,我得到Coverity问题"包装器对象使用后自由(WRAPPER_ESCAPE)1。escape:本地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();
将创建一个具有自动存储的字符串。然后用return hello.c_str();
返回一个指向下级char*
的指针。这样做的问题是,在函数(}
)结束时,所有自动对象都被销毁。这将删除您刚刚传递的指针指向的字符串的内容。在其他函数中使用指针是未定义的行为,因为内存已被释放。
如果您想返回一个持久的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库函数传递某些内容的直接上下文中,否则不应该使用c_str()
,或者至少,这是避免这些问题的最直接的方法。
相关文章:
- 尝试构建"lock-free"数据结构C++
- 调用 free() 有时会导致程序崩溃
- Valgrind 大小为 8 且地址 0x5b7e520 的读取无效,在大小为 16 的块内为 0 字节 free'd
- 为什么 free() 函数不将内存返回给操作系统?
- "fast"或"normal"在"free(): invalid next size (fast)"中是什么意思?
- 逻辑'double free or corruption (fasttop)'错误
- emplace_back和push_back给出错误'double free or corruption (fasttop)'尽管定义了复制和移动构造函数
- free():在有效指针异常中-使用流读取巨大文件时
- C-Free and MySQL connect
- 为什么FREE块堆这么大
- std::free线程安全吗
- 为什么'allocate in one library and free in the other'是错误的
- C++ 调用析构函数后动态模板队列"double free or corruption (out)"
- 不断得到分段错误和free()无效指针
- "terminate called after throwing an instance of std::invalid_argument' what(): stoi ?"
- C++: free(): 无效的下一个大小(快速)
- 在 malloc 之后检查 &在调用 free() 之前
- free():在 C++ 中的 tcache 2 中检测到双重释放
- 我正在得到掩护性 issuse 作为"Wrapper object use after free (WRAPPER_ESCAPE)"
- 堆损坏 - "Free Heap block 61af0f0 modified at 61af194 after it was freed" C++