Gov*_*van 1 c++ valgrind pointers memory-leaks eclipse-cdt
在我的一个c ++函数中,我称之为ab demangle.我想在将其更改为字符串后取消分配结果.这是代码:
const char * realName;
string name;
const std::type_info &ti = typeid(*this);
realName = abi::__cxa_demangle(ti.name(), 0, 0, &status);
name= realName;
int index =name.find_last_of(':');
name = name.substr(index+1, name.length()-index-1);
free((void *) realName);
Run Code Online (Sandbox Code Playgroud)
代码运行没有问题但是eclipse编译器不满意并且显示使用free的错误:"函数'free'无法解析".
我尝试使用删除而不是免费.
delete realName;
Run Code Online (Sandbox Code Playgroud)
代码运行没有问题,eclipse编译器很高兴,但是当我用valgrind分析代码时,我得到一个分析错误:不匹配free()/ delete/delete []
所以我的问题是:1-我应该在c ++中使用free还是我只使用delete,delete [] 2-如果我不应该使用free为什么valgrind给我一个错误3-如果我应该使用free为什么eclipse cdt comipler给出我编译错误但是当我运行代码时一切正常.4-我的代码是否具有基于c ++ 11的正确样式?或者它是c和旧c ++的组合?
我应该用
free
C++或我将只使用delete
,delete[]
?
您应该使用与分配匹配的函数或运算符.为自己分配内存时,应使用new
/ new[]
进行分配,使用delete
/ delete[]
进行重新分配.
当要释放的内存来自其他来源时,例如__cxa_demangle
,您应该阅读文档以了解在重新分配时需要使用哪些功能.您的函数的文档说明了这一点
demangled名称放在分配的内存区域中
malloc
.
因此,您必须使用free
它来释放它.
如果我应该使用
free
为什么Eclipse cdt编译器给我一个编译错误但是当我运行代码时一切正常.
函数free
在<cstdlib>
头文件中定义.您需要将此标头添加到您的cpp文件,以确保您的代码编译正常.