马上能想到的函数有:


GetMem
AllocMem
ReallocMem
FreeMemGetMemory
ReallocMemory
FreeMemoryNew
DisposeNewStr
DisposeStrStrNew
StrAlloc
StrDisposeGlobalAllocPtr
GlobalFreePtrWideStrAlloc
AnsiStrAlloc
StrDisposeMove
MoveMemory
CopyMemory
ZeroMemory
FillMemory
FillCharStrBufSize

给字符指针(PChar、PWideChar、PAnsiChar)分配内存, 最佳选择是: StrAlloc.

StrAlloc 虽然最终也是调用了 GetMem, 但 StrAlloc 会在指针前面添加 Delphi 需要的 4 个管理字节(记录长度).

StrAlloc 分配的内存, 用 StrDispose 释放, 用 StrBufSize 获取大小.

用 FreeMem 释放可以吗? 这样会少释放 4 个字节.

这种类型的指针一般用于 API 函数的参数, 譬如获取窗口标题:


  p: PChar;p := StrAlloc();GetWindowText(Handle, p, StrBufSize(p));ShowMessage(p); StrDispose(p);
;

StrAlloc 根据不同的参数(PWideChar、PAnsiChar)分别重载调用了 WideStrAlloc、AnsiStrAlloc, 所以我们也可以直接使用这两个函数(这也需要用 StrDispose 释放), 不过使用它们的必要性不大; 用 StrAlloc 指定好参数类型即可.

给字符指针分配内存其他方法也挺方便, 譬如:


  buf: [..MAX_PATH]  Char;GetWindowsDirectory(buf, Length(buf));ShowMessage(buf);
;

数组的内存不是我们自己申请的, 系统会自动释放; 记住: 只要是手动申请的内存一定要手动释放.

我们给字符指针申请内存主要是为了在 API 中接受数据, 如果我们要直接赋给常量值, 系统会自动分配内存的, 譬如:


  p: PChar;p := ;ShowMessage(p);
;

当然我们也可以用这种办法申请内存, 就是笨了点, 譬如:


  p: PChar;p := PChar(StringOfChar(Char(), )); GetSystemDirectory(p, StrBufSize(p));ShowMessage(p);
;

如果在 API 函数需要的字符指针是为了输入, 当然也不需要申请内存, 譬如:


  p: PChar;p := ;SetWindowText(Handle, p);
;MessageBox(Handle, , , MB_OK);
;str: ;str := ;TextOut(Canvas.Handle, , , PChar(str), Length(str));;

跑题了...到现在已用到了 StrAlloc、StrDispose、WideStrAlloc、AnsiStrAlloc、StrBufSize 几个函数.

还有 NewStr、DisposeStr、StrNew、StrDispose 也貌似有点关系.

先说 NewStr 和 DisposeStr(它们是一对);
NewStr 是根据 AnsiString 再新建一个 PAnsiString, 不过这是为兼容而存在的, Delphi 已不提倡使用了.
不再提倡使用的函数都缀以 deprecated 标识, 并在代码提示中用灰色显示.
其实用 @ 即可获取字符串指针, 当然根本用不着它们.

还有个 StrNew; StrNew 可以再制一个相同的字符指针, 譬如:


  p1,p2: PChar;p1 := ;p2 := StrNew(p1);ShowMessageFmt(, [p1, p2]); p1 := ;ShowMessageFmt(, [p1, p2]); StrDispose(p2);
;

不过 StrNew 存在的意义也不大, 我们可以更简单地完成上面的操作:


  p1,p2: PChar;p1 := ;p2 := p1;ShowMessageFmt(, [p1, p2]); p1 := ;ShowMessageFmt(, [p1, p2]);
;

说来说去, 好像只有 StrAlloc 是我们值得我们记忆的?

还有一对非常重要的相关函数: GlobalAllocPtr、GlobalFreePtr; 它们的功能是上面这些都不可替代的!

GlobalAllocPtr 和 GlobalFreePtr 是对系统函数: GlobalAlloc、GlobalFree 的简化, 之所以说它们重要, 只是因为它们可以跨进程操作; 不过 GlobalAllocPtr 是给无类型指针(Pointer)分配内存, 当然就不仅仅用于字符指针了. 还是到后面专题再做例子吧.


转载于:https://blog.51cto.com/rosehacker/455962

Delphi 的内存操作函数(1): 给字符指针分配内存相关推荐

  1. Delphi 的内存操作函数(2): 给数组指针分配内存

    静态数组, 在声明时就分配好内存了, 譬如: vararr1: array[0..255] of Char;arr2: array[0..255] of Integer; beginShowMessa ...

  2. c语言字符指针分配内存,内存分配函数及使用注意事项,C语言内存分配函数完全攻略...

    C 语言主要提供 malloc.realloc.calloc.alloca 与 aligned_alloc 等内存分配函数来实现对内存的分配功能. 1)malloc 函数原型如下: void * ma ...

  3. c语言指针如何增加内存大小,C语言如何给指针分配内存?

    匿名用户 1级 2010-09-20 回答 看了下,基本上回答的都是用new 那个,都是C++程序员吧 c语言里面是用malloc的 写了个简单程序,看看是不是楼主需要的 #include #incl ...

  4. 【C 语言】二级指针作为输入 ( 自定义二级指针内存 | 为 二级指针 分配内存 - 存放 一维指针 | 为每个 一级指针 分配内存 | 释放二维指针内存 )

    文章目录 一.二级指针 1.为 二维指针 分配内存 2.为每个 一维指针 分配内存 3.释放 二维指针 内存 二.完整代码示例 一.二级指针 声明二级指针 : // 声明二维指针char **p = ...

  5. C 中的内存操作函数-memcpy 等(to be continued)

    文章目录 C中的内存操作函数 1.memcpy() 1.1 函数介绍 1.2 示例代码 1.3 Reference C中的内存操作函数 1.memcpy() 1.1 函数介绍 void *memcpy ...

  6. C语言——常见的字符串函数+内存操作函数的介绍及实现

    文章目录 前言 一.字符串函数 1.求字符串长度 strlen 2.长度不受限制的字符串函数strcpy.strcat.strcmp 字符串拷贝 strcpy 字符串追加拷贝 strcat 字符串比较 ...

  7. C语言程序设计 | 模拟实现内存操作函数:strncpy, strncat, strncmp, memcpy, memmove

    模拟实现字符串和内存操作函数(二)目录: strncpy strncat strncmp strcmp memcpy memmove strncpy char* strncpy(char* dst, ...

  8. 字符串转内存c语言,【一起学C】C语言面试题必考:字符串操作函数,内存操作函数实现...

    本帖最后由 奉聪 于 2017-1-25 14:54 编辑 *******前言******* 我数一下,我发了几个帖子,1.2.3? 哈哈哈,没几个哈,感谢吾爱,让我学到了很多,乐于分享,共同进步! ...

  9. 【C进阶】之动态内存分配及内存操作函数

    动态内存分配及内存操作函数 1 动态内存分配的介绍 2 malloc和free函数 3 测试代码 4 goto的使用场合,常用于出错处理 5 memset() 6 memcpy() 7 memcmp( ...

最新文章

  1. 中国小品演员都要卷舌?
  2. 怎么用php制作会员注册表单,帝国CMS前台会员登陆表单的制作教程
  3. 十七、去年jQuery的笔记
  4. 061 hive中的三种join与数据倾斜
  5. html去掉父元素样式,CSS清除浮动使父级元素展开的三个方法
  6. jmeter异步请求测试_使用JMeter对异步HTTP / REST服务进行压力/负载测试
  7. HTH的完整形式是什么?
  8. linux磁盘调度算法
  9. oracle 常用语句汇总
  10. 如何简单的理解TDD与DDT
  11. Android USBCamera投屏 - 利用UVC协议将手机上的画面有线投屏到Android车机的屏幕上
  12. 仿微信 即时聊天工具 - SignalR (一)
  13. 金属酞菁催化剂可促进氧还原反应
  14. 今日头条 Android ‘秒‘ 级编译速度优化
  15. #507 Wiggle Sort II
  16. AFD-0654: AFD is not supported on Exadata systems CRS-10001: Errors xxx.ko was not found
  17. Favicon.ico图片在线制作网站PHP源码+支持多种图片格式转换
  18. 搭档之家|打造信息交互平台,推进合作新发展
  19. matlab qpsk调试 rls均衡,通信系统仿真速成第2天:QPSK调制与解调(实验)
  20. 报错Error from chokidar (C:\): Error: EBUSY: resource busy or locked, lstat ‘C:\hiberfil.sys‘

热门文章

  1. linux下mysql日志管理及mysql备份还原
  2. 设计模式之桥接模式(Java语言描述)
  3. 黑马程序员————java线程之间的通信
  4. nagios监控服务短信报警开发及部署细节
  5. “scikit-learn(sklearn) 官方文档中文版”
  6. ubuntu挂载移动硬盘出现错误:mount:unknown filesystem type ‘exfat‘
  7. git 如何关联多个库
  8. 【转载】线段树 区间合并 小结
  9. 4.XXE (XML External Entity Injection)
  10. 纯css3实现瀑布流布局