Excel精英培训网

 找回密码
 注册
数据透视表40+个常用小技巧,让你一次学会!
12
返回列表 发新帖
楼主: xdwy81129

[已解决]不喜欢可以合并二维数组吗?

[复制链接]
发表于 2011-4-9 16:52 | 显示全部楼层
感觉也不是的,比如字符串,字符串本身有长有短,占用的内存大小是不一样的,而数组是连续存放的,每个数组元素的大小是一样的。也正因为这样,在数组中储存的是字符串的地址,而真正的字符串存在另一个地方。这个字符串占用的内存由系统自身管理,好象是引用计数,就是说有任何一个地方引用了这个字符串,引用计数加1,同样,释放一个引用,引用计数减1,释放数组只是释放了数组元素的内存,而字符串占用的内存由系统(也许是VBE)自己管理,当引用计数为0时,系统释放字符串占用的内存。

以上纯粹是个人想法,没得到任何资料证明。不知哪一天能不能写段代码来证明这个想法
excel精英培训的微信平台,每天都会发送excel学习教程和资料。扫一扫明天就可以收到新教程
回复

使用道具 举报

发表于 2011-4-9 16:57 | 显示全部楼层
吕?布 发表于 2011-4-9 16:52
感觉也不是的,比如字符串,字符串本身有长有短,占用的内存大小是不一样的,而数组是连续存放的,每个数组 ...

那就是意味着我们内存拷贝的时候就把数值数组(存地址的)或文本数组(存内容)两个中间的一个拷贝过去,但是没有相应的拷贝了引用计数的东西
或者说拷贝了地址的数组和引用计数的东西,但是这个引用计数和原来的引用计数成为两个独立的数据,但是又同时影响着文本数组(内容),当其中一个变为0的时候删除文本数组(内容),而另一个仍提示在引用中。于是就出错了?

点评

感觉是两者管理了同一个字符串的内存,一个先把它释放了,另一个再去释放它原来占用的内存时便出错了(这个内存有可能已经重新分配给别人了)  发表于 2011-4-9 17:40
回复

使用道具 举报

发表于 2011-4-9 17:37 | 显示全部楼层
就是说内存由两个人管理,一个是系统(也许是操作系统,也许是Excel),一个是使用者(VBA程序员),我们能控制的只是使用者这块,而系统也是按默认情况(使用者不操作内存)来处理的,但我们操作的内存,扰乱了系统对内存的控制。
比如我们用修改内存的方法改变了一个引用(形象的讲有点象快捷方式),但是系统并不知道,还要根据原来的引用去处理内存,比如我们代码已经释放了内存,但系统默认也要管理这块内存,也要去释放他,所以最后系统去操作内存时那块内存可能已经重新被使用了。这个时候再去释放他便出错了。

所以经常是单步执行没有问题,一个过程执行完了便直接退出来了。
深入的我也讲不清了,我讲的全是我的猜测,则才测试了一下字符串数组,实际上每个字符串的内存都是不同的,这个与我先前想的引用计数又相违背。所以,最可能的情况是内存的两种管理方法。

点评

恩,两种机制共同管理的可能性比较大诶  发表于 2011-4-9 19:27
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|Archiver|Excel精英培训 ( 豫ICP备11015029号 )

GMT+8, 2024-5-24 23:58 , Processed in 0.342209 second(s), 5 queries , Gzip On, Yac On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表