用New()函数能为一个指针分配指定长度的内存空间。
在为某个结构分配内存时,因为编译器知道要分配的内存的大小,所以调用
New()就能分配到所需的字节。
用Dispose()来释放用New()分配的内存。
当编译器不知道要分配多少内存时,就要用到GetMem()和AllocMem().
另,AllocMem()要比GetMem()安全,因为AllocMem()总是把分配个它的内存初始化为零。
在为某个结构分配内存时,因为编译器知道要分配的内存的大小,所以调用
New()就能分配到所需的字节。
用Dispose()来释放用New()分配的内存。
当编译器不知道要分配多少内存时,就要用到GetMem()和AllocMem().
另,AllocMem()要比GetMem()安全,因为AllocMem()总是把分配个它的内存初始化为零。
解决方案 »
- 各位朋友,代码中访问网络时,有没有办法判断是防火墙屏蔽了该程序?
- cxgrid的单元格在光标到时都会全选里面内容,能否不全选?
- fastreport 分组打印
- 显示窗体
- 如果捕捉系统对文件操作的消息,并加以利用?!
- 求助 图片浏览工具的代码我怎么也调不通,高手请进
- Delphi插入图片到Excel,报错,实在不解!如何解决?
- 在delphi中调用c#编写的web service时遇到的问题?请大家帮忙一下!多谢!
- 救命啊,如何打开一个DOS窗口并执行指定的带参数的批处理文件?
- 如何在combobox1中添加图标?高手解答!!!!!急救……………………
- 請教有關於Nested Dataset,DatasetField的問題!
- TControl的难题。。。我怎么也想不通。。。怎么办。。。 我的可用分也不多了。。。
可能是你在对P进行非法操作而引起的sizeof(p^)=1而不是我期望的MAX_PATH(260)
=1是正确的,因为p^是p指针指向的第一个字符所以长度为1
FreeMem(P);
这样就不会出错,因为你创建了然后释放,这是对的。
如果中间用了GetWindowsdirectory(P,MAX_PATH);在释放,就会出错,
原因是 ,因为pchar在用时系统会分配一块内存给它,这样,P不在是你分的那块内存,也许是系统使用的一部分,这样调用freemem就会出错。
s:string;
begin
setlength(s,MAX_PATH);
getwindowdirectory(pchar(s),MAX_PATH);
setlength(s,strlen(pchar(s));
end;
D5开发人员指南28页
P:PChar;
begin
P := PChar(AllocMem(MAX_PATH)); <--
try
GetWindowsdirectory(P,MAX_PATH);
...
...
finally
FreeMem(P); //出现异常(Invalid pointer operation)
//P:=nil
end;
end;