c++ - jemalloc 未检测到内存损坏

标签 c++ malloc jemalloc

以下程序不会触发断言失败:

int main(int argc, char **argv)
{
  int * n = (int *)malloc(100);
  //malloc_stats_print(nullptr, nullptr, "gablh");
  free(n);
  *n += 1;
  std::cerr << *n << std::endl;
  for (int i = 0; i != 10; ++i) {
    std::cerr << *(n+i) << std::endl;
  }
}

当我运行程序时 MALLOC_CONF="quarantine:32,abort:true,stats_print:true"ex_stats_pr

我得到:

1515870811
1515870811
1515870810
1515870810
1515870810
1515870810
1515870810
1515870810
1515870810
1515870810
1515870810

有没有办法用 jemalloc 触发中止失败?

最佳答案

这不是您问题的直接答案,但是...

未定义的行为是未定义的。玩弄被释放的内存属于这个阵营。根据您对内存处理程序的实现,您可能有一个“验证内存”类型的函数,它遍历您的空闲内存列表以查看是否存在某种损坏,但即使这样也不会捕获所有内容(不是熟悉 jemalloc 尤其是我自己)。可能是您的上述代码命中了没人关心的内存,因此不会被捕获。哎呀,你的 std::cerr 语句也在执行未定义的行为,所以你甚至不能相信它的值(想想线程和操作系统获取和更改内存等)

这是您尽可能不在 C++ 中直接使用指针的原因之一。管理生命周期的智能指针和容器自动防止几乎所有这些类型的错误。

关于c++ - jemalloc 未检测到内存损坏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37732361/

相关文章:

c - malloc 无法为队列中的结构创建空间

memory-leaks - jemalloc 堆分析仅跟踪分配吗?

c - 在 C 程序中为 jemalloc 设置 MALLOC_CONF 环境变量不起作用

java - Spring Boot应用程序不使用jemalloc

c++ - CRTP (C++) 的各种错误

c++ - 如何让 signal_add 在 Gtk::Layout::put 上触发?

c - 64 位平台上 GCC 中的基本堆使用统计信息

c++ - 为什么带有 CryptUnprotectData 的 RAD Studio CreateBlobStream 会返回额外的字符?

c++ - chrome 原生消息 : can a native host executable start with arguments?

c - 我似乎无法打印出字符类型矩阵