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

using free(const char *) in c++ 11

在我的一个 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' could not be resolved".

我尝试使用 delete 而不是 free。

delete realName;

代码 运行 没有问题,eclipse 编译器很满意,但是当我使用 valgrind 分析代码时,出现分析错误: 不匹配的 free() / delete / delete []

所以我的问题是: 1- 我应该在 C++ 中使用 free 还是只使用 delete, delete [] 2- 如果我不应该使用 free 为什么 valgrind 给我一个错误 3- 如果我应该免费使用,为什么 eclipse cdt comipler 会给我一个编译错误,但是当我 运行 编码时一切正常。 4- 我的代码是否具有基于 C++11 的正确样式?或者它是 c 和旧 c++ 的组合?

您必须使用 free,因为文档中说使用 free

也许您需要包含正确的头文件和库。 #include <stdlib.h> 也许 -lC

Should I use free in C++ or shall I use just delete, delete[]?

您应该使用与分配匹配的函数或运算符。分配内存供自己使用时,应使用new/new[]进行分配,使用delete/delete[]进行释放。

当要释放的内存来自其他来源时,例如__cxa_demangle,您应该阅读文档以了解在释放时需要使用哪些功能。您的函数的 documentation 指出

the demangled name is placed in a region of memory allocated with malloc.

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

If I should use free why Eclipse cdt compiler is giving me a compile error but when I am running code everything is OK.

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