pString在以下情况是否需要是否内存?多谢!!
1,    curIP: PString;    curIP := ttreenode.Data;
2,  New(curIP);
    curIP^ := Trim(AdoQry.FieldByName('szIP').AsString);
    SubNode.Data := curIP;
这两中情况是否需要释放内存?有什么区别?
 如果需要是否内存,怎么释放?多谢!

解决方案 »

  1.   

    1.
    curIP := ttreenode.Data;
    看你的Data有没有分配内存 如果没有则错误 如果有 则表示curIP只是指向data的首地址而已,完全正确.2. 
    New(curIP);
        curIP^ := Trim(AdoQry.FieldByName('szIP').AsString);
        SubNode.Data := curIP;
    // 最好用Move(SubNode.Data, curIp...); // 用字符拷贝,而且Data也要分配内存。。
    不然这样Data只是指向一个内存首址,但是这个curIP是局部的。。所以会出错误。。
    如果data不是静态数组 那么需要分配内存 然后拷贝 然后在释放CurIp的内存New -> Free
    GetMem -> FreeMem.
      

  2.   

    1. 不需要(如果你有代码会释放treenode.data的话)
    2. 需要: curIP^ := ''; dispose(curIP); 
    BTW: 楼上的在瞎说
      

  3.   

    可能 我New -> Free写错了。。c++ new -> delete
    c   malloc -> free
    delphi
        new -> dispose 是吧。。 没用过
        GetMem -> FreeMem... 
        
    偶其他的有瞎说么?? 大哥.
      

  4.   

    即使curIP是局部的, 你用了New(curIP)之后它就是全局的了, 必须用dispose, freemem显式释放, 不然就有泄漏
      

  5.   

    即使curIP是局部的, 你用了New(curIP)之后它就是全局的了// 这句话 怎么说? 说实话 偶对delphi的内存管理还不是很熟悉。。
      

  6.   

    即使curIP是局部的, 你用了New(curIP)之后它就是全局的了?
    这句话是什么意思?能否说说看呀?
    curIP := Nil是否能否释放其内存?如果不能又是什么意思?有什么用?
      

  7.   

    呵呵 肯定是不行的啦变量都有声明周期的。。curIP如果是在某个函数内定义的 那么这个函数执行完了 curIP这个变量是不会存在的 不过如果没有释放curIP的内存 那么curIP指向的那段内存不能被其他程序使用到 就是造成所谓的 内存泄漏
      

  8.   

    那这样是否内存的话,要怎么释放呢?
    是不是直接dispose(curIP)就可以了,如果没有new的话,就不要释放了?
      

  9.   

    我不是写了么 delphi
        new -> dispose 
        GetMem -> FreeMem... mei new 就不用释放。。
      

  10.   

    变量由这是自身和变量的内存占用组成。
    1,  curIP: PString; //一个栈上的变量即自身
      curIP := ttreenode.Data; //指向ttreenode.Data
        //并没有在堆上为curIP动态分配内存空间,即变量的内存占用不存在。不用释放,curIP这个栈上的变量(局部变量)自动释放。2,  curIP: PString;  //curIP仍然是栈上的变量
      New(curIP);      //在堆上动态分配内存,此时栈上curIP变量指向此内存。即变量的内存占用
        curIP^ := Trim(AdoQry.FieldByName('szIP').AsString); //将右边的内容拷贝到curIP指向此内存
        SubNode.Data := curIP;
        //在堆上动态分配内存是要释放的,在保证函数返回正确情况下调用Dispose(curIP)
      

  11.   

    如上,我如果通过这种方式给treeview的一个treenode.data赋值了,
    赋值方式:
    curIP: PString;  //curIP仍然是栈上的变量
      New(curIP);      //在堆上动态分配内存,此时栈上curIP变量指向此内存。即变量的内存占用
        curIP^ := Trim(AdoQry.FieldByName('szIP').AsString); //将右边的内容拷贝到curIP指向此内存
        SubNode.Data := curIP;
    那么,我在dispose(curIP)时候,是否SubNode.data的值也没有了?是不是也以前被释放掉了吧?
      

  12.   

    》那么,我在dispose(curIP)时候,是否SubNode.data的值也没有了?是不是也以前被释放掉了吧?
    A:是的。
    只要在你操作完SubNode.Data数据后在dispose(curIP)就可以了。
      

  13.   

    楼主 没看清我先前的回复么SubNode.Data := curIP;
    看你的这个data 是指针还是静态数组 如果是指针必须使用前分配内存 或者用的时候指向一个正确的且生命周期足够长的内存,
    为静态数组则不需要分配了像楼上说的也是可以的 你只要保证你的指针指向的是安全的 可用的 有意义的内存即可。很简单的 内存操作
      

  14.   

    如果我是只想释放dispose(curIP),不想
    将SubNode.Data的数据释放掉怎么办? curIP是个局部变量,而SubNode.Data是全局变量, 我如果把curIP释放了,那么treeview就出错了
      

  15.   

    靠楼主没仔细看回复。。如果我是只想释放dispose(curIP),不想
    将SubNode.Data的数据释放掉怎么办? // 所以你需要 给Data分配相应的空间 然后用拷贝的形式将curIP的内容拷贝到Data中去
    这样当curIP即使被释放 也无所谓 因为Data指向正确的内存 并且里面的值也是正确的.............
    此贴不再回复。。