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

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 ++的组合?

das*_*ght 7

我应该用freeC++或我将只使用delete,delete[]

您应该使用与分配匹配的函数或运算符.为自己分配内存时,应使用new/ new[]进行分配,使用delete/ delete[]进行重新分配.

当要释放的内存来自其他来源时,例如__cxa_demangle,您应该阅读文档以了解在重新分配时需要使用哪些功能.您的函数的文档说明了这一点

demangled名称放在分配的内存区域中malloc.

因此,您必须使用free它来释放它.

如果我应该使用free为什么Eclipse cdt编译器给我一个编译错误但是当我运行代码时一切正常.

函数free<cstdlib>头文件中定义.您需要将此标头添加到您的cpp文件,以确保您的代码编译正常.