在c ++ 11中使用free(const char *)

时间:2015-10-11 09:28:43

标签: c++ pointers memory-leaks valgrind 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);

代码运行没有问题,但是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 ++的组合?

2 个答案:

答案 0 :(得分:6)

  

我应该在C ++中使用free还是仅使用deletedelete[]

您应该使用与分配匹配的函数或运算符。当您为自己分配内存时,应使用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