【问题标题】:using free(const char *) in c++ 11在 C++ 11 中使用 free(const char *)
【发布时间】:2016-01-08 21:21:09
【问题描述】:

在我的一个 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 的错误:“函数'free' 无法解析”。

我尝试使用删除而不是免费。

delete realName;

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

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

【问题讨论】:

    标签: c++ pointers memory-leaks valgrind eclipse-cdt


    【解决方案1】:

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

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

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

    解构后的名称放置在分配有malloc 的内存区域中。

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

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

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

    【讨论】:

    • 感谢您的回答。我应该使用 还是 ?为什么代码在eclipse中运行没有问题,但在eclipse中显示编译错误?
    • @Govan 在 C++ 中 <cstdlib> 标头对应于 C 的 <stdlib.h>
    • <cstdlib> 保证 std::free 存在,<stdlib.h> 保证 free 存在(在全局命名空间中),不保证反过来也能正常工作
    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-08-01
      • 1970-01-01
      • 2022-08-11
      • 2013-06-12
      相关资源
      最近更新 更多