new 一个是分配地址
a:=@x 也是分配地址
a:=@x 也是分配地址
解决方案 »
- 同时执行两条删除SQL语句,如何写最简洁
- 如何把DBGrid的数据在报表里打印、预览
- 高手救命!
- TWebBrowser中,如何访问页面中的array??
- linux_chen到这里来拿分!!谢谢了,我还要麻烦你哟!呵呵
- Ado连接SqlServer的问题
- 在更改dbgrid 中的值的时候能否不更新数据库????
- 钱币符问题
- 自定义的控件,怎么获取设计时属性?
- dbgrid 中 字段 value 与 display value 对应
- 我做了一个多线程数据库查询的程序,出现以下错误Insufficient memory for this operation
- 请问如何将数据库中的英文字段名显示为中文,比如说在listbox中.
new(a)是给a分配一个地址,就是在内存中找到一块空闲的地址分配给a,如果再用a^:=34,把34这个数写到这块地址中。如果使用a := @x的话,就把a指向另一个地址了,那么在执行dispose(a);的时候就会出错。
a := @x,程序没有为a开辟新空间,而是使用已有的地址空间,比如a := @x的话直接把a指向内存中的一个地址(这个地址就是保存变量x的地址,已经存在)同时把x赋值给a。所以你如果直接用a^ := x的话(还没有a := @x之前),就会出现访存错误,如果之前已经把a指向一个integer变量的话(比如已经执行a := @x),就不会出错了。 说得很乱,希望你能看明白
x,y:integer;
a:^integer;
begin
new(a);
x:=34;
a:=@x;
y:=a^;
showmessage(inttostr(y));
end;但是在调用 a:= @x 后就不能Dispose(a)了,因为a指向的地址已经发生了改变,指向了x
的地址。
to others:谢谢大家!
的时候会自动分配4字节的空间。实际上上面正确的代码是:var
x,y:integer;
a:^integer;
begin
new(a);
x:=34;
a^:=x;
y:=a^;
showmessage(inttostr(y));
dispose(a);
end;这个问题:http://www.csdn.net/expert/topic/343/343652.shtm 可能同本贴有相同之处
这它妈的和C++是一回事:
void myFun()
{int x,y;
int *a;
x=34;
a=new int;
*a=x;
y=*a;
cout<<y<<endl;
delete a;
}
//给你点解释
1.
var
a:^integer; {在栈内分配内存,指针型a所占的内存大小为4}
begin
new(a); {在堆内分配出一大小为sizeof(integer)其地址赋予a}
a^:=34; {地址为a的内存区域(堆内)被赋予值:34}
showmessage(inttostr(a^));
dispose(a); {释放在堆内分配的空间,堆内分配的空间不会自动释放}
end; {a本身在栈中所占的地盘自动归还,这是栈的特点} 2.
var
x,y:integer; {在栈内分配内存,x,y所占的内存大小为4}
a:^integer; {在栈内分配内存,指针型a所占的内存大小为4}
begin
x:=34; {x被赋予值:34}
a:=@x; {a被赋予x的地址,这个地址当然是位于栈内}
y:=a^;
showmessage(inttostr(y));
end;在1中为什么用new()呢?因为1不像2已经有了一个大小为4的integer整型区域存在(即x)
怎么办?所以只好自力更生,利用new(a)在堆内分配一个空闲区域,然后再赋给它(堆内)
34;那位说了,为什么不可以直接a^:=34,看怎么讲了,凡是在栈内分配的内存空间,都是
随机值的:你不信?
var
i,n:integer;
begin
showmessage(inttostr(i)+' '+inttostr(n))
end;
看它是不是0 0,也就是说a:^integer之后,a并不一定是NIL,而是一值(谁它妈知道),
所以你搞:a^:=34;我刚才说过,这个语句是给具有地址为a的区域赋值为34,这样可以一些重要的
区域内容就给你小子改了,所以才new(a)分配一个安全区域。相反dispose(a)就是将a所指的堆内存
释放,为什么释放?你小子它妈的是个败家子,我不跟你讲了。有兴趣的朋友可以Q我:676795,我对这事贼有兴趣。