GetMem问题(100分)

  • 主题发起人 主题发起人 robinswp
  • 开始时间 开始时间
R

robinswp

Unregistered / Unconfirmed
GUEST, unregistred user!
看如下程序:
procedure TFmMain.N12Click(Sender: TObject);
begin
PreTabSheet := PageConTrol1.ActivePage;
TSACDSTatusEnter(Sender);
PageConTrol1.ActivePage := TSACDStatus;
end;

procedure TFmMain.TSACDStatusEnter(Sender: TObject);
var
ACDNum,i:Integer;
DesSize:Word;
PACDIDArray:^ACDIDArray;
PACDInfo:PDBCCC_ACD_INFO;//PDBCCC_ACD_INFO := ^TDBCCC_ACD_INFO(结构体);
PDes:Pchar;
Num:integer;
begin
GetMem(PACDInfo,SizeOf(TDBCCC_ACD_INFO));
DesSize := 10;
CBACDStatusQue.Items.Clear;
WRet:=CcPhone.QueryACDID;
if WRet <> CCS_OK then
begin
Application.MessageBox('查询呼叫队列ID失败','确认',MB_OK);
exit;
end;
if WRet = CCS_OK then
begin
ACDNum:=CcPhone.ACDNumber;
SetLength(ArrayACDID,ACDNum);
// Try
GetMem(PACDIDArray,ACDNum*Sizeof(Word));
Move(CcPhone.Total_ACDID^,PACDIDArray^,ACDNum*Sizeof(Word))
// New(Pdes);
for i := 0 to ACDNum-1 do
begin
ArrayACDID := PACDIDArray^;
New(Pdes);
WRet := CcPhone.QueryACDSkill(ArrayACDID,pDes,DesSize);
if WRet <> CCS_OK then
begin
Application.MessageBox('查询呼叫队列技能失败','确认',MB_OK);
exit;
end;
//ReallocMem(PDes,DesSize+1);
CBACDStatusQue.Items.Add(StrPas(PDes));
Dispose (pDes);
end;
CBACDStatusQue.ItemIndex := 0;
// finally
FreeMem(PACDIDArray,ACDNum);
// Dispose (pDes);

// end;

// Try
Num := sizeof(TDBCCC_ACD_INFO);
// ????????????
// New(PACDInfo);
WRet := CcPhone.QueryACDStatus(ArrayACDID[0],PACDInfo);
if WRet <> CCS_OK then
begin
Application.MessageBox('查询呼叫队列状态失败','确认',MB_OK);
exit;
end;
EdtACDStatusQueSize.Text := IntToStr(PACDInfo.usQueueSize);
EdtACDStatusQueTime.Text := IntToStr(PACDInfo.ulQueueTime);
EdtACDStatusWaitTime.Text := IntToStr(PACDInfo.ulEstWaitTime);
EdtACDStatusLoginAgents.Text := IntToStr(PACDInfo.usLoggedOnAgents);
EdtACDStatusAvailAgents.Text := IntToStr(PACDInfo.usAvailAgents);
// finally
FreeMem(PACDInfo);
// Dispose (pDes);
// FreeMem(PACDIDArray);
// end;
end;
在TSACDSTatusEnter(Sender)退出时报程序非法操作;
如把GetMem(PACDInfo,SizeOf(TDBCCC_ACD_INFO))放在//??????????处则执行
GetMem(PACDInfo,SizeOf(TDBCCC_ACD_INFO))时出错.
 
看看再说
 
仔细检查您申请的内存有没有释放。
建议您使用如下类型 TMemoryStream这个东东很安全的。


 
问题我已解决了
1.FreeMem(PACDIDArray,ACDNum) 改为FreeMem(PACDIDArray,ACDNum*sizeof(word))
2.把New(PDes)....Dispose(PDes) 换成 GetMem(PDes,100)...FreeMem(Pdes,100);
对于2,我现在很困惑,难道New()与GetMem()有差别吗? 有谁能告诉我
 
New和GetMem确实有区别。

New是创建一个指针,其分配字节大小与指针所指类型有关。

GetMem是根据给出的大小分配一块內存块。

PChar是指向Char的指针。New(PDes)只分配了一个字节的內存块。
 
New与GetMem的区别,
New 不但分配内存,大小与其类型有关,比如如果是Record类型,将分配的大小就是该
Record的值,而且,它还会自动改变指针的地址!!,这就是关键之处.
比如说
type
M : record
...

var
p : M;

.. ..
begin

new(p)
// p 的地址与p指向的地址都被改变,


GetMem(p,sizeof(p))
// p的地址不变..


--- 所以new 通常用来开辟链表..

while ...
begin
new(p)

p.next := ..;
p.data := ..

end;


 
GetMem(PACDInfo,SizeOf(TDBCCC_ACD_INFO));
FreeMem(PACDIDArray,ACDNum);
尺寸不一致!......
你怎么自己发现了,...,真有意思!
问题都解决完了怎么还不结束,让我眼都看花了?
 
不好意思,我说错了一点,

New与GetMem的区别,
New 分配内存,大小与其类型有关,比如如果是Record类型,
将分配的大小就是该
Record的大小.
而GetMem可以允许用户分配固定的内存大小.

而new 通常用来开辟链表
 
Robin 在做呼叫中心的项目吗?
交流一下号码?
 
to polygon :我的Mail: sonweiping@21cn.com
 
多人接受答案了。
 

Similar threads

I
回复
0
查看
463
import
I
I
回复
0
查看
472
import
I
I
回复
0
查看
863
import
I
I
回复
0
查看
650
import
I
I
回复
0
查看
524
import
I
后退
顶部