局部数组变量的地址
function test():integer;
var
ary:array [0..100] of char;
begin
ary[0]:=#0;
result:=integer(@ary)+integer(ary[0]);
end;
上面的一段代码,每次返回的ary的地址都是一样,如果在线程中调用这样的函数,加入test()的处理时间比较长才退出,会不会出现ary还在处理的时候,被另外一个调用覆盖数据?
如果会的话,那就产生脏数据了,要怎么避免?
如果不会,为什么?他们的地址都是一样的,那操作的都是相同的一段内存吧?
还是我这样返回得到的只是对于函数入口地址的偏移量?
[解决办法]
不会
局部变量是在栈上进行分配内存的,它的内存地址是变化的
在函数或方法被调用时分配,在调用结束后其内存就被释放
[解决办法]
稍微持一点保留意见,首先局部变量用完释放是对的,但是delphi的内存分配机制不是把内存还给系统,而是保留给下次使用(LZ所说的上面的一段代码,每次返回的ary的地址都是一样也应该就是碰巧遇到了这种情况)
Lz的代码有一部分是直接操作数组指针的地址,这种操作本身非常不安全,很容易修改不该修改的内存地址,轻则造成脏数据,重则异常退出,当多线程时,这种使用尤为致命,所以如果想多线程操作同一个array就按照2L进行修改,如果只是调用函数我觉得应该避免出现integer(@ary)这样的代码