在我的一个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);
代码运行没有问题,但是eclipse编译器不满意并且显示使用free的错误:" Function' free'无法解决"。
我尝试使用删除而不是免费。
delete realName;
代码运行没有问题,eclipse编译器很高兴,但是当我用valgrind分析代码时,我得到一个分析错误: 不匹配free()/ delete / delete []
所以我的问题是: 1-我应该在c ++中使用free还是只使用delete,delete [] 2-如果我不应该使用自由为什么valgrind给我一个错误 3-如果我应该使用free为什么eclipse cdt comipler给我一个编译错误但是当我运行代码时一切正常。 4-我的代码是否具有基于c ++ 11的正确样式?或者它是c和旧c ++的组合?
答案 0 :(得分:6)
我应该在C ++中使用
free
还是仅使用delete
,delete[]
?
您应该使用与分配匹配的函数或运算符。当您为自己分配内存时,应使用new
/ new[]
进行分配,并使用delete
/ delete[]
进行重新分配。
当要释放的内存来自其他来源(例如__cxa_demangle
)时,您应该阅读文档以了解在重新分配时需要使用哪些功能。您的函数的documentation表示
demangled name放在分配有
malloc
的内存区域中。
因此,您必须使用free
释放它。
如果我应该使用
free
为什么Eclipse cdt编译器给我一个编译错误但是当我运行代码时一切正常。
函数free
在<cstdlib>
标头中定义。您需要将此标头添加到cpp文件中,以确保代码编译正常。
答案 1 :(得分:2)
您必须使用free
,因为文档说使用free
。
也许您需要包含正确的头文件和库。
#include <stdlib.h>
也许-lC