GMS和GMS2中坑爹的数据结构序号
疯花正猫 发表于 2018-12-10 06:41:32 1014

今天闲来无事在玩耍gms2的时候,着实被数据结构的序号回收给狠狠地坑了一把0 0

众所周知在GM里,所有的数据结构创建后,返回给你的都是0,1,2,3等数字,这个设计看似很舒服,其实很蠢。加上GMS和GMS2(GM8未知)会把删除的数据结构序号给回收。(现在GMS1.4.9999版本也会回收了。我记得以前的GMS不会回收被删除的数据结构序号的,也许记错了吧。)

,供下一次创建使用,于是更加蠢的事情出现了。。

来看一串代码:

var a = ds_list_create();
show_debug_message("a:"+string(a));
ds_list_destroy(a);
var a2 = ds_list_create();
show_debug_message("a2:"+string(a2));
show_debug_message("a-exists:"+string(ds_exists(a,ds_type_list)));

然后这个是控制台的输出结果:

【a2成功的上位顶替掉了a,并且骗过了gms2,让gms2误以为a还存在】

明明看代码的逻辑是:创建listA->删除listA->创建listB->检测listA是否存在

期望输出的应该是listA不存在,然而gms2却告诉你listA还在呀。

感觉算gml的缺陷之一吧,不过也没什么办法,指针引用什么的,别想啦。


所以这个序号回收有时候会导致一些奇怪的情况发生,今天我就交代了好几个小时进去啦。

各位,要小心哪~



最新回复 (8)
  • Mage松仁玉米 发表于 2018-12-10 06:44:37
    0 2
    所以你删除列表的时候要把a变量也给清了才行。
  • 顺子 发表于 2018-12-10 06:45:53
    0 3
    这……一旦正经用起来好像很容易踩到的样子-_-|
  • 疯花正猫 发表于 2018-12-10 06:51:26
    0 4
    Mage松仁玉米 所以你删除列表的时候要把a变量也给清了才行。
    是的,当时比较懒,想后面通过ds_exists来判断列表还在不在。那现在就是需要告诉子节点谁是你的父节点,然后跑去去父节点里把自己删了才行,稍微麻烦一点
  • 疯花正猫 发表于 2018-12-10 06:53:03
    0 5
    顺子 这……一旦正经用起来好像很容易踩到的样子-_-|
    留个心眼吧哈哈,感觉和list用完不释放差不多的错误性质
  • liureng 发表于 2018-12-10 07:23:38
    0 6
    经测试GM8也是一样的
    a1:1

    a2:1

    a1-exists:1
  • yunzl 发表于 2019-01-24 06:07:23
    0 7
    当你操作第二次的时候,此时的a其实是第二个list
  • yunzl 发表于 2019-01-24 06:08:19
    0 8
    哦我理解你的意思了
  • 不动king 发表于 2019-01-25 06:03:20
    0 9
    还有这种事,虽然没踩过