指针及其生存期问题?
   在一个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是否可以引用?这样做之后,系统提示这样使用指针是不安全的(有警告但没有错误),
  我应该如何使用指针?如何安全的如用指针?

解决方案 »

  1.   

    而且现在想释放ptr指针也不行了,由于它已经随onclick过程结束而释放了,而我还想使用指针所引用的内容,我现在糊涂了!
      

  2.   

    1. 保證不是空指針 所指向的地址不為空
    所以一般類似使用 
    ptr.free
    ptr := nil;2. 保證不是野指針 
    就是說你指針所指向的地址對於你使用時來說是安全的 可見的...
    比如你使用了一個生命週期在你使用前已經無效的指針.拿麼這樣的後果是無法預料的...3. 注意內存洩漏 動態創建的 一定記得適當的時機動態釋放...
      

  3.   

    看楼主的代码, ptr 是函数那的局部变量,OnClick 之后,你怎么知道 New 出来的东西在哪?如果是想每按一次按钮就创建一个 intptr,并保存起来,可以用变长数组嘛!如果非要在堆上创建,可以用 TList 来保存这些指针。比如:
    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;
      

  4.   

    有点明白了,list应该是全局(如果需要在全局中使用的话)的或是单元的,不应该是过程的.因为创建指针是为了使用灵活的使用它所引用的地址内容,这样在单元内任一个地方都能使用它,如果不用了,也可以在任一地方销毁它!
      大侠们,我的理解对吗?
      

  5.   

    楼主的理解是对的。控制变量的作用域是“严谨”编程中很重要的一条。一个变量,如果是在一个函数里用,那就把它定义为函数的变量;如果只在一个单元里用,那就定义成单元的;...这个控制作用域的问题在 C 语言中似乎更明确一些,可以控制得更精确:
    int foo(const int v)
    {
        {
           int tmp;   // 
           ....       // tmp 在这里用
        }             // 用 {, } 来限制 tmp 的作用域
        ....          // tmp 从此以后就用不着了
    }