看过《游戏引擎架构》后我开始对内存的分配问题关注,一直想用内存分配器来管理游戏的内存。前两天发现了有许多第三方内存分配器可以用。最后挑中了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设置内存分配器的一个坑的更多相关文章

  1. 关于pyinstaller打包程序时设置icon时的一个坑

    关于pyinstaller打包程序时设置icon时的一个坑     之前在用pyinstaller打包程序的时候遇到了关于设置图标的一点小问题,无论在后面加--icon 或是-i都出现报错.查了下st ...

  2. 14.6.4 Configuring the Memory Allocator for InnoDB 配置InnoDB 内存分配器

    14.6.4 Configuring the Memory Allocator for InnoDB 配置InnoDB 内存分配器 当InnoDB 被开发时,内存分配提供了操作系统和 run-time ...

  3. 内存分配器 (Memory Allocator)

    对于大多数开发人员而言,系统的内存分配就是一个黑盒子,就是几个API的调用.有你就给我,没有我就想别的办法. 来UC前,我就是这样觉得的.实际深入进去时,才发现这个领域里也是百家争鸣.非常热闹.有操作 ...

  4. Nah Lock: 一个无锁的内存分配器

    概述 我实现了两个完全无锁的内存分配器:_nalloc 和 nalloc.  我用benchmark工具对它们进行了一组综合性测试,并比较了它们的指标值. 与libc(glibc malloc)相比, ...

  5. linux内存管理--伙伴系统和内存分配器

    3.1页框的管理 所有的页框描述符都存放在mem_map数组中. 3.1.1page数据结构 struct page { page_flags_t flags; //标志 atomic_t _coun ...

  6. 使用ffmpeg视频编码过程中踩的一个坑

           今天说说使用ffmpeg在写视频编码程序中踩的一个坑,这个坑让我花了好多时间,回头想想,非常多时候一旦思维定势真的挺难突破的.以下是不对的编码结果:                   ...

  7. 14.4.4 Configuring the Memory Allocator for InnoDB InnoDB 配置内存分配器

    14.4.4 Configuring the Memory Allocator for InnoDB InnoDB 配置内存分配器 当InnoDB 被开发, 内分配齐 提供了与操作系统和运行库往往缺乏 ...

  8. CoreCLR源码探索(三) GC内存分配器的内部实现

    在前一篇中我讲解了new是怎么工作的, 但是却一笔跳过了内存分配相关的部分. 在这一篇中我将详细讲解GC内存分配器的内部实现. 在看这一篇之前请必须先看完微软BOTR文档中的"Garbage ...

  9. FDG内存分配器笔记

    FDG: 大规模并行系统中的动态内存分配器由于需要全局同步(记账) ,导致性能急剧下降. 代码解析 1.superblock 类中包含两个变量,两个函数.默认superblock大小为2048 ite ...

随机推荐

  1. 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 ...

  2. SPA+.NET Core3.1 GitHub第三方授权登录 使用AspNet.Security.OAuth.GitHub

    GitHub第三方授权登录 使用SPA+.NET Core3.1实现 GitHub第三方授权登录 类似使用AspNet.Security.OAuth.GitHub,前端使用如下:VUE+Vue-Rou ...

  3. 创意app1

      app名称: 与我相似的人 app目的: 旨在通过云匹配,搜索到与自己类似爱好或者性格的人用户相似的内容:衣服品牌鞋子手机笔记本键盘鼠标相机刮胡刀自行车工作  说明: 现有的格局 百度贴吧是面向多 ...

  4. Mybase desktop7.3破解

    1.Mybase Desktop 7.3 安装包 百度云链接: 链接:https://pan.baidu.com/s/1mWZ2_Qmkf6aAX9CYgrN12A 提取码:vjw7 2.破解包 百度 ...

  5. 20191017-4 alpha week 2/2 Scrum立会报告+燃尽图 03

    此作业要求参见https://edu.cnblogs.com/campus/nenu/2019fall/homework/9800 小组名称:“组长”组 组长:杨天宇 组员:魏新,罗杨美慧,王歆瑶,徐 ...

  6. 从零开始のcocos2dx生活(七)ParticleSystem

    CCParticleSystem是用来设置粒子效果的类 1.粒子分为两种模式:重力模式 和 半径模式 重力模式独占属性: gravity 重力方向,Vec2类型,可以分别指定不同方向的重力大小 spe ...

  7. 洛谷$P3756\ [CQOI2017]$老$C$的方块 网络流

    正解:网络流 解题报告: 传送门$QwQ$ 看到不能出现给定的讨厌的图形,简单来说就,特殊边两侧的方格不能同时再连方格. 所以如果出现,就相当于是四种方案?就分别炸四个格子. 然后冷静分析一波之后发现 ...

  8. 「洛谷P3202」[HNOI2010]弹飞绵羊 解题报告

    P3203 [HNOI2010]弹飞绵羊 题目描述 某天,Lostmonkey发明了一种超级弹力装置,为了在他的绵羊朋友面前显摆,他邀请小绵羊一起玩个游戏.游戏一开始,Lostmonkey在地上沿着一 ...

  9. 「P5004」专心OI - 跳房子 解题报告

    题面 把\(N\)个无色格子排成一行,选若干个格子染成黑色,要求每个黑色格子之间至少间隔\(M\)个格子,求方案数 思路: 矩阵加速 根据题面,这一题似乎可以用递推 设第\(i\)个格子的编号为\(i ...

  10. React实现座位排布组件

    React实现座位排布组件 最近在开发一个影院系统的后台管理系统,该后台可以设置一个影厅的布局. 后台使用的是react框架,一位大神学长在几天之内就把这个控件研究出来了,并进行了较为严密的封装,佩服 ...