一個小問題關於PCHAR的前後問題幫我看看。(100分)

  • 主题发起人 主题发起人 hzjone
  • 开始时间 开始时间
H

hzjone

Unregistered / Unconfirmed
GUEST, unregistred user!
var<br> &nbsp; lsTemp:string;<br>begin<br> &nbsp; lsTemp:='ab';<br> &nbsp; showmessage(inttostr(integer(pchar(lsTemp)))+','+inttostr(integer(@lsTemp[1]))+','+inttostr(integer(pchar(lsTemp))));//前面值與後面不一樣。。<br>end;
 
中间的那个操作移动了指针?<br>还是分配了两次内存?有意思
 
需要注意的是,取字符串地址的时候不能用@s[1]操作来进行,因为这种操作可能引发copy on write机制
 
在pchar()强制转化过成中系统还是会分配内存的。
 
答案不满意,。。。提前。。。
 
是integer的问题,后面的值是lsTemp[1]的地址,原因我也想知道。但是lsTemp的值并没有变。
 
这个是很正常的,IntToStr的参数不是const,因此在其内部<br>是被复制了一次的,给出的地址其实是子程序内部的临时变量的地址,<br>因此结果可能是不同的。<br><br>如果lsTemp是全局变量就应该不复制,这个问题就没有了!或者<br>你把lsTemp作为常量传给一个获取地址的过程就完全一致了。
 
copy on write
 
来自:liuchong, 时间:2006-11-7 15:10:48, ID:3616843<br>需要注意的是,取字符串地址的时候不能用@s[1]操作来进行,因为这种操作可能引发copy on write机制 &nbsp;<br><br>我觉得这个答案最合理<br>liuchong请就这个例子给讲讲?
 
如果内存管理模块发现有试图改变引用计数的操作的话,会首先把字符串内容复制一遍--这就是Delphi帮助里面经常会提到的“为了确保引用计数为1的copy on write机制”。<br><br>当使用@s[1]时,不管它出现在赋值号“:=”的左边还是右边,内存管理模块都认为试图改变引用计数。
 
上边的答案似有道理,但我还是有一个凝问,经测试,lsTemp前后的值并没有改变,而integer在这里是什么作用,为什么用integer前后读出的值不一样,即使内存管理模块把字符串内容复制了一遍,而lsTemp前后的值并没有改变啊。
 
var<br> &nbsp; lsTemp:string;<br>这里的“lsTemp”只是一个指针而已与“@lsTemp[1]”是相同的<br>Integer只是把指针转换成数字,目地是为了显示出来<br>lsTemp虽然没有变,但它在内存中有两份,因为已经copy on write了<br>“需要注意的是,取字符串地址的时候不能用@s[1]操作来进行,因为这种操作可能引发copy on write机制 ”
 

Similar threads

I
回复
0
查看
800
import
I
I
回复
0
查看
876
import
I
I
回复
0
查看
609
import
I
后退
顶部