我在MacOS上编写C++程序,编译连接都没有问题,但是运行的时候有这个提示,这是什么错误引起的:

malloc: nano zone abandoned due to inability to preallocate reserved vm space

举报 使用道具
| 回复

共 5 个关于本帖的回复 最后回复于 2021-11-9 18:00

Fuller 管理员 发表于 2021-11-9 17:49:15 | 显示全部楼层
你的程序使用new或者malloc分配了内存对吧?

检查一下你的编译选项,是不是打开了sanitize,比如,-fsanitize=address -fsanitize=undefined等等。估计是sanitize引起的。不要这个编译选项试试
举报 使用道具
发誓学好内容分析 金牌会员 发表于 2021-11-9 17:50:01 | 显示全部楼层
Fuller 发表于 2021-11-9 17:49
你的程序使用new或者malloc分配了内存对吧?

检查一下你的编译选项,是不是打开了sanitize,比如,-fsanit ...

太棒了,大牛!不用这个编译选项确实就没有这个提示了。什么原因?
举报 使用道具
Fuller 管理员 发表于 2021-11-9 17:58:01 | 显示全部楼层
发誓学好内容分析 发表于 2021-11-9 17:50
太棒了,大牛!不用这个编译选项确实就没有这个提示了。什么原因?

我没有细看sanitize的文档,推测是这样的。
sanitize选项大概是用来做更加严格的内存使用检查的,比如,一个函数有个参数是指针类型的,类似这样,void func(int * x),如果不开这个选项,在函数中可以执行 x++ ,让x指向内存中下一个存储整数的位置。但是,如果打开sanitize选项,就会编译错误,大概意思是不能在stack修改x,去指向一个不确定是否有的存储区域。


说回来这个提示,这个应该仅仅是提示,如果是错误,会标明ERROR,并且给出错误的内存情况。

如果你能上google,可以搜这句话,会看到一个stackoverflow的回答,答主看了mac电脑上的nano_malloc.c源代码,找到了出这个提示的代码位置,得出了一个结论,具体你去查查吧。大概意思就是因为开了这个选项,程序运行的时候会注入监测模块,干扰了内存分配,不过不是错误
举报 使用道具
发誓学好内容分析 金牌会员 发表于 2021-11-9 17:58:26 | 显示全部楼层
Fuller 发表于 2021-11-9 17:58
我没有细看sanitize的文档,推测是这样的。
sanitize选项大概是用来做更加严格的内存使用检查的,比如, ...

可以关闭这个提示吗?
举报 使用道具
Fuller 管理员 发表于 2021-11-9 18:00:33 | 显示全部楼层

假设可运行程序是 a.out,会报这个提示,那么运行的时候设置一个环境变量就好了,在命令行终端这样运行
  1. MallocNanoZone=0 ./a.out
复制代码


举报 使用道具
您需要登录后才可以回帖 登录 | 立即注册

精彩推荐

  • Gephi社会网络分析-马蜂窝游记文本分词并同
  • Gephi社会网络分析-基于马蜂窝游记文本以词
  • 知乎话题文本根据词语间距筛选后生成共词矩
  • 马蜂窝游记文本分词后以词语间距为筛选条件
  • 学习使用apriori算法挖掘关联关系

热门用户

GMT+8, 2024-3-28 23:03