指针及其生存期问题?
在一个Unit中:在interface区用type申明一个记录类型:
type
intptr=record
state:integer;
rights:integer;
end; 然后在窗体中的一button的onchick事件中写入:
var
ptr:^intptr ; //定义用户打针,现在ptr是intptr记录的指针begin
new(ptr);
ptr^.state:=123;
ptr^.rights:=45;
end; 现在问题是:我在上面的过程中没有用dispose(ptr)释放指针,而ptr由于是在button的onclick事件中定义的,所以运行完onclick过程之后ptr变量本身已经释放了,如果在其它过程中想使用
ptr指针,用intptr^.state是否可以引用?这样做之后,系统提示这样使用指针是不安全的(有警告但没有错误),
我应该如何使用指针?如何安全的如用指针?
在一个Unit中:在interface区用type申明一个记录类型:
type
intptr=record
state:integer;
rights:integer;
end; 然后在窗体中的一button的onchick事件中写入:
var
ptr:^intptr ; //定义用户打针,现在ptr是intptr记录的指针begin
new(ptr);
ptr^.state:=123;
ptr^.rights:=45;
end; 现在问题是:我在上面的过程中没有用dispose(ptr)释放指针,而ptr由于是在button的onclick事件中定义的,所以运行完onclick过程之后ptr变量本身已经释放了,如果在其它过程中想使用
ptr指针,用intptr^.state是否可以引用?这样做之后,系统提示这样使用指针是不安全的(有警告但没有错误),
我应该如何使用指针?如何安全的如用指针?
所以一般類似使用
ptr.free
ptr := nil;2. 保證不是野指針
就是說你指針所指向的地址對於你使用時來說是安全的 可見的...
比如你使用了一個生命週期在你使用前已經無效的指針.拿麼這樣的後果是無法預料的...3. 注意內存洩漏 動態創建的 一定記得適當的時機動態釋放...
var
List: TList; // 全局的,或者...
在 OnClick 里:
var
ptr:^intptr ; //定义用户打针,现在ptr是intptr记录的指针
begin
new(ptr);
ptr^.state:=123;
ptr^.rights:=45;
List.Add(ptr);
end;用的时候:
type
Pintptr = ^intptr;
for i := 0 to List.Count do
begin
Pintptr(List.Items[i]).state := ...;
Dispose(Pintptr(List.Items[i])); // 释放
end;
大侠们,我的理解对吗?
int foo(const int v)
{
{
int tmp; //
.... // tmp 在这里用
} // 用 {, } 来限制 tmp 的作用域
.... // tmp 从此以后就用不着了
}