关于指针类型,关于FreeMem出错.该怎么处理
关于指针类型,关于FreeMem出错.
type
TAT_INFO = record
JobTime: DWord;
DaysOfMonth: DWord;
DaysOfWeek: UCHAR;
Flags: UCHAR;
Command: PWideChar;
end;
PAT_INFO = ^TAT_INFO;
var
ATInfo : PAT_Info;
dwJobID : PDWORD;
第一个问题:
if ATInfo = nil then Exit;
和
if @ATInfo = nil then Exit;
有什么区别?
第二个问题:
ATInfo是否需要用GetMem分配内存?
为什么要分配?为什么普通的自定义结构不需要?
分配之后是否应该使用ZeroMemory清零?
dwJobID是PDWORD的指针类型,在调用是否也需要用GetMem分配内存?
第三个问题:
ATInfo^.JobTime := dwRemoteTime;
ATInfo^.DaysOfMonth := 0;
ATInfo^.DaysOfWeek := 0;
ATInfo^.Flags := 1;
ATInfo^.Command := wcCommand;
dwReturn := NetScheduleJobAdd(wcServer, ATInfo, dwJobID);
FreeMem(ATInfo); //这句出现异常
PS:本人很菜,希望大牛别鄙视.
------解决方案--------------------
第一个问题是指针为空,和指针指向的数据为空的区别.就像身份证为空和人为空一样.
第二个问题:你定义的是一个指针,不是数据,那么你的数据放在哪儿呢,就要用GetMem来申请空间,指针再指向这个地方,就像你房号和你家房子一样,没有房子,你拿房号来怎么接快递.
第三个问题是你有没有申请空间,没有申请空间你去把操作系统别的内存修改了当然会错.
------解决方案--------------------
第三个 NetScheduleJobAdd函数肯定是对传入的指针做了修改,导致释放时无法正确获取最初的指针信息
type
TAT_INFO = record
JobTime: DWord;
DaysOfMonth: DWord;
DaysOfWeek: UCHAR;
Flags: UCHAR;
Command: PWideChar;
end;
PAT_INFO = ^TAT_INFO;
var
ATInfo : PAT_Info;
dwJobID : PDWORD;
第一个问题:
if ATInfo = nil then Exit;
和
if @ATInfo = nil then Exit;
有什么区别?
第二个问题:
ATInfo是否需要用GetMem分配内存?
为什么要分配?为什么普通的自定义结构不需要?
分配之后是否应该使用ZeroMemory清零?
dwJobID是PDWORD的指针类型,在调用是否也需要用GetMem分配内存?
第三个问题:
ATInfo^.JobTime := dwRemoteTime;
ATInfo^.DaysOfMonth := 0;
ATInfo^.DaysOfWeek := 0;
ATInfo^.Flags := 1;
ATInfo^.Command := wcCommand;
dwReturn := NetScheduleJobAdd(wcServer, ATInfo, dwJobID);
FreeMem(ATInfo); //这句出现异常
PS:本人很菜,希望大牛别鄙视.
------解决方案--------------------
第一个问题是指针为空,和指针指向的数据为空的区别.就像身份证为空和人为空一样.
第二个问题:你定义的是一个指针,不是数据,那么你的数据放在哪儿呢,就要用GetMem来申请空间,指针再指向这个地方,就像你房号和你家房子一样,没有房子,你拿房号来怎么接快递.
第三个问题是你有没有申请空间,没有申请空间你去把操作系统别的内存修改了当然会错.
------解决方案--------------------
第三个 NetScheduleJobAdd函数肯定是对传入的指针做了修改,导致释放时无法正确获取最初的指针信息