pString在以下情况是否需要是否内存?多谢!!
1, curIP: PString; curIP := ttreenode.Data;
2, New(curIP);
curIP^ := Trim(AdoQry.FieldByName('szIP').AsString);
SubNode.Data := curIP;
这两中情况是否需要释放内存?有什么区别?
如果需要是否内存,怎么释放?多谢!
1, curIP: PString; curIP := ttreenode.Data;
2, New(curIP);
curIP^ := Trim(AdoQry.FieldByName('szIP').AsString);
SubNode.Data := curIP;
这两中情况是否需要释放内存?有什么区别?
如果需要是否内存,怎么释放?多谢!
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. 需要: curIP^ := ''; dispose(curIP);
BTW: 楼上的在瞎说
c malloc -> free
delphi
new -> dispose 是吧。。 没用过
GetMem -> FreeMem...
偶其他的有瞎说么?? 大哥.
这句话是什么意思?能否说说看呀?
curIP := Nil是否能否释放其内存?如果不能又是什么意思?有什么用?
是不是直接dispose(curIP)就可以了,如果没有new的话,就不要释放了?
new -> dispose
GetMem -> FreeMem... mei new 就不用释放。。
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)
赋值方式:
curIP: PString; //curIP仍然是栈上的变量
New(curIP); //在堆上动态分配内存,此时栈上curIP变量指向此内存。即变量的内存占用
curIP^ := Trim(AdoQry.FieldByName('szIP').AsString); //将右边的内容拷贝到curIP指向此内存
SubNode.Data := curIP;
那么,我在dispose(curIP)时候,是否SubNode.data的值也没有了?是不是也以前被释放掉了吧?
A:是的。
只要在你操作完SubNode.Data数据后在dispose(curIP)就可以了。
看你的这个data 是指针还是静态数组 如果是指针必须使用前分配内存 或者用的时候指向一个正确的且生命周期足够长的内存,
为静态数组则不需要分配了像楼上说的也是可以的 你只要保证你的指针指向的是安全的 可用的 有意义的内存即可。很简单的 内存操作
将SubNode.Data的数据释放掉怎么办? curIP是个局部变量,而SubNode.Data是全局变量, 我如果把curIP释放了,那么treeview就出错了
将SubNode.Data的数据释放掉怎么办? // 所以你需要 给Data分配相应的空间 然后用拷贝的形式将curIP的内容拷贝到Data中去
这样当curIP即使被释放 也无所谓 因为Data指向正确的内存 并且里面的值也是正确的.............
此贴不再回复。。