allegro设置内存分配器的一个坑
看过《游戏引擎架构》后我开始对内存的分配问题关注,一直想用内存分配器来管理游戏的内存。前两天发现了有许多第三方内存分配器可以用。最后挑中了nedmalloc,这个库也是ogre所使用的,测试了一下,确实比VS的malloc/free要快不少。
通过写几个简单的函数就可以代替allegro内存分配器,十分方便,又顺便给box2d也换了。
allegro通过调用al_set_memory_interface()来替换内存分配器。然后我把这个函数放到了al_init()后面。一运行,发现很正常,不错。点击窗口的关闭按钮,然后报错了!我就猜想是不是放的位置不对。在设置分配器之前调用了al_init(),那就说明allegro初始化的时候申请的内存用的分配器还是默认的分配器,关闭的时候卸载这些初始化的数据缺用的是nedmalloc的free,这样肯定就报错了。于是我把al_set_memory_interface()放到了al_init()之前。再运行,关闭。完全正常!到这里我以为事情就结束了。
后来在写了若干代码之后发现上面那个关闭时报错的问题又出现了!于是开始找问题,注释了几乎所有代码,问题依旧。最后又单步调试,发现报错是在main()返回之后出现的,才意识到,这个问题出现在静态变量上,接着单步调试,发现问题出在一个String类的身上。这个类封装了allegro的字符串操作函数。(这个类所属的库用c++11封装了allegro所有的对象及其操作,官方也推荐过链接)
这时突然才想起来我在一个cpp文件里定义了一个文件内的局部变量,类型正是这个String。这是个静态变量,也就是说它初始化的时候main还没调用,卸载的时候也在main()返回之后了。在我这个程序里就是用默认的malloc new的它,但最后却用nedfree delete的它,这就出问题了。为了解决这个问题,我在main()返回之前再一次调用al_set_memory_interface()。然后运行,又报错!这次是al_uninstall_system()出错了。
我意识到,这是allegro的初始化和卸载的配对出了问题。我原来一直没有用过al_uninstall_system()这个函数,因为原来查资料说是allegro会自动调用这个函数。之后就是查手册,看源码,终于搞懂了。al_init()其实是个宏,用来代替al_install_system(),用al_init()的话会把al_uninstall_system()注册为main()结束后调用的函数(atexit)。所以就不能再用al_init()来初始化了,然后再手动uninstall。
整理一下思路:就是在al_install_system()设置内存分配器,在al_uninstall_system()后设置回默认的分配器。
下面是代码:
int main()
{
al_set_nedmalloc_memory_interface();
if (!al_install_system(ALLEGRO_VERSION_INT, 0))
{
return 1;
}
...
al_uninstall_system();
al_set_memory_interface(0);
return 0;
}
以后要用哪个函数的时候,最好还是先看下它的说明。在这个问题之前我都不知道al_install_system()的存在。
allegro设置内存分配器的一个坑的更多相关文章
- 关于pyinstaller打包程序时设置icon时的一个坑
关于pyinstaller打包程序时设置icon时的一个坑 之前在用pyinstaller打包程序的时候遇到了关于设置图标的一点小问题,无论在后面加--icon 或是-i都出现报错.查了下st ...
- 14.6.4 Configuring the Memory Allocator for InnoDB 配置InnoDB 内存分配器
14.6.4 Configuring the Memory Allocator for InnoDB 配置InnoDB 内存分配器 当InnoDB 被开发时,内存分配提供了操作系统和 run-time ...
- 内存分配器 (Memory Allocator)
对于大多数开发人员而言,系统的内存分配就是一个黑盒子,就是几个API的调用.有你就给我,没有我就想别的办法. 来UC前,我就是这样觉得的.实际深入进去时,才发现这个领域里也是百家争鸣.非常热闹.有操作 ...
- Nah Lock: 一个无锁的内存分配器
概述 我实现了两个完全无锁的内存分配器:_nalloc 和 nalloc. 我用benchmark工具对它们进行了一组综合性测试,并比较了它们的指标值. 与libc(glibc malloc)相比, ...
- linux内存管理--伙伴系统和内存分配器
3.1页框的管理 所有的页框描述符都存放在mem_map数组中. 3.1.1page数据结构 struct page { page_flags_t flags; //标志 atomic_t _coun ...
- 使用ffmpeg视频编码过程中踩的一个坑
今天说说使用ffmpeg在写视频编码程序中踩的一个坑,这个坑让我花了好多时间,回头想想,非常多时候一旦思维定势真的挺难突破的.以下是不对的编码结果: ...
- 14.4.4 Configuring the Memory Allocator for InnoDB InnoDB 配置内存分配器
14.4.4 Configuring the Memory Allocator for InnoDB InnoDB 配置内存分配器 当InnoDB 被开发, 内分配齐 提供了与操作系统和运行库往往缺乏 ...
- CoreCLR源码探索(三) GC内存分配器的内部实现
在前一篇中我讲解了new是怎么工作的, 但是却一笔跳过了内存分配相关的部分. 在这一篇中我将详细讲解GC内存分配器的内部实现. 在看这一篇之前请必须先看完微软BOTR文档中的"Garbage ...
- FDG内存分配器笔记
FDG: 大规模并行系统中的动态内存分配器由于需要全局同步(记账) ,导致性能急剧下降. 代码解析 1.superblock 类中包含两个变量,两个函数.默认superblock大小为2048 ite ...
随机推荐
- ZOJ Problem Set - 1090——The Circumference of the Circle
ZOJ Problem Set - 1090 The Circumference of the Circle Time Limit: 2 Seconds Memory Limit: 65 ...
- SPA+.NET Core3.1 GitHub第三方授权登录 使用AspNet.Security.OAuth.GitHub
GitHub第三方授权登录 使用SPA+.NET Core3.1实现 GitHub第三方授权登录 类似使用AspNet.Security.OAuth.GitHub,前端使用如下:VUE+Vue-Rou ...
- 创意app1
app名称: 与我相似的人 app目的: 旨在通过云匹配,搜索到与自己类似爱好或者性格的人用户相似的内容:衣服品牌鞋子手机笔记本键盘鼠标相机刮胡刀自行车工作 说明: 现有的格局 百度贴吧是面向多 ...
- Mybase desktop7.3破解
1.Mybase Desktop 7.3 安装包 百度云链接: 链接:https://pan.baidu.com/s/1mWZ2_Qmkf6aAX9CYgrN12A 提取码:vjw7 2.破解包 百度 ...
- 20191017-4 alpha week 2/2 Scrum立会报告+燃尽图 03
此作业要求参见https://edu.cnblogs.com/campus/nenu/2019fall/homework/9800 小组名称:“组长”组 组长:杨天宇 组员:魏新,罗杨美慧,王歆瑶,徐 ...
- 从零开始のcocos2dx生活(七)ParticleSystem
CCParticleSystem是用来设置粒子效果的类 1.粒子分为两种模式:重力模式 和 半径模式 重力模式独占属性: gravity 重力方向,Vec2类型,可以分别指定不同方向的重力大小 spe ...
- 洛谷$P3756\ [CQOI2017]$老$C$的方块 网络流
正解:网络流 解题报告: 传送门$QwQ$ 看到不能出现给定的讨厌的图形,简单来说就,特殊边两侧的方格不能同时再连方格. 所以如果出现,就相当于是四种方案?就分别炸四个格子. 然后冷静分析一波之后发现 ...
- 「洛谷P3202」[HNOI2010]弹飞绵羊 解题报告
P3203 [HNOI2010]弹飞绵羊 题目描述 某天,Lostmonkey发明了一种超级弹力装置,为了在他的绵羊朋友面前显摆,他邀请小绵羊一起玩个游戏.游戏一开始,Lostmonkey在地上沿着一 ...
- 「P5004」专心OI - 跳房子 解题报告
题面 把\(N\)个无色格子排成一行,选若干个格子染成黑色,要求每个黑色格子之间至少间隔\(M\)个格子,求方案数 思路: 矩阵加速 根据题面,这一题似乎可以用递推 设第\(i\)个格子的编号为\(i ...
- React实现座位排布组件
React实现座位排布组件 最近在开发一个影院系统的后台管理系统,该后台可以设置一个影厅的布局. 后台使用的是react框架,一位大神学长在几天之内就把这个控件研究出来了,并进行了较为严密的封装,佩服 ...