关于内存释放的问题(100分)

  • 主题发起人 主题发起人 oocoolie
  • 开始时间 开始时间
O

oocoolie

Unregistered / Unconfirmed
GUEST, unregistred user!
有一个指针数组,数组中的每一个指针指向一个结构
type
pChannel=^channel;
Channel=record
Cindex:integer;
operation:string[20];
channelname:string[50];
description:string[200];
ip:string[20];
port:integer;
localip:string[20];
workdir:string[200];
BitRate:integer;
FECRatio:integer;
Sendtimes:integer;
enabled:integer;
ChannelType:integer;
SendFilelist:integer;
end;

var
m_Channels:array of PChannel;
setlength(m_Channels,10);

for i:=0 to 9 do
getmem(m_Channels,sizeof(Channel));

请问怎样完全释放这个动态数组的内存?
下面的代码恰当吗?
for i:=0 to length(m_channels)-1 do
freemem(m_channels);
setlength(m_channels,0);

btw:如果定义结构时我不固定string的大小,则sizeof返回的结构大小为56,并且给string
字段赋值出错,请问默认的编译器给string定义的大小是?
 
string在默认下是256
用{H+}后
string是2G
 
动态数值是生存期自管理的,离开作用域时会自动释放。
如果想提前释放,将其值置为nil即可。
 
你这句setlength(m_Channels,10);就是给m_Channels申请空间了!
不用再GetMem, 释放也不用FreeMem.
非要手工释放就用setlength(m_channels,0);或m_channels := nil
或者不理它就行了。

如果定义结构时不指定string的大小,那你用SetLength为m_Channels分配内存的时候并没有
替那些string类型的成员分配内存,直接赋值就出错了。当然你也可以用SetLength为每一个
成员分配内存的: SetLength(m_Channels[0].operation, 200) 假设operation: string;
 
谢谢各位
to xianjun:
但我的动态数组是一个指针数组:array of pchannel
不是:array of channel,因此如果不用getmem为每个元素取得内存的话赋值就出错,还有
释放的问题,如果只是setlength(m_channels,0)或者:=nil又或者不理它的话,是不是只
释放了指针所占用的4个字节内存而没有释放每个指针所指向的结构变量所对应的内存呢?

 
to oocoolie: 你说得没错
我没看清楚你的题目。 [^]
如果你用Getmem分配空间,也必须用FreeMem来回收了。所以你上面的代码都是没错的!
string默认是LongString,最大值可达到2G,但它不会默认给你分配空间的。
 
多人接受答案了。
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
I
回复
0
查看
551
import
I
后退
顶部