Delphi 的内存操作函数(1): 给字符指针分配内存
马上能想到的函数有:
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): 给字符指针分配内存相关推荐
- Delphi 的内存操作函数(2): 给数组指针分配内存
静态数组, 在声明时就分配好内存了, 譬如: vararr1: array[0..255] of Char;arr2: array[0..255] of Integer; beginShowMessa ...
- c语言字符指针分配内存,内存分配函数及使用注意事项,C语言内存分配函数完全攻略...
C 语言主要提供 malloc.realloc.calloc.alloca 与 aligned_alloc 等内存分配函数来实现对内存的分配功能. 1)malloc 函数原型如下: void * ma ...
- c语言指针如何增加内存大小,C语言如何给指针分配内存?
匿名用户 1级 2010-09-20 回答 看了下,基本上回答的都是用new 那个,都是C++程序员吧 c语言里面是用malloc的 写了个简单程序,看看是不是楼主需要的 #include #incl ...
- 【C 语言】二级指针作为输入 ( 自定义二级指针内存 | 为 二级指针 分配内存 - 存放 一维指针 | 为每个 一级指针 分配内存 | 释放二维指针内存 )
文章目录 一.二级指针 1.为 二维指针 分配内存 2.为每个 一维指针 分配内存 3.释放 二维指针 内存 二.完整代码示例 一.二级指针 声明二级指针 : // 声明二维指针char **p = ...
- C 中的内存操作函数-memcpy 等(to be continued)
文章目录 C中的内存操作函数 1.memcpy() 1.1 函数介绍 1.2 示例代码 1.3 Reference C中的内存操作函数 1.memcpy() 1.1 函数介绍 void *memcpy ...
- C语言——常见的字符串函数+内存操作函数的介绍及实现
文章目录 前言 一.字符串函数 1.求字符串长度 strlen 2.长度不受限制的字符串函数strcpy.strcat.strcmp 字符串拷贝 strcpy 字符串追加拷贝 strcat 字符串比较 ...
- C语言程序设计 | 模拟实现内存操作函数:strncpy, strncat, strncmp, memcpy, memmove
模拟实现字符串和内存操作函数(二)目录: strncpy strncat strncmp strcmp memcpy memmove strncpy char* strncpy(char* dst, ...
- 字符串转内存c语言,【一起学C】C语言面试题必考:字符串操作函数,内存操作函数实现...
本帖最后由 奉聪 于 2017-1-25 14:54 编辑 *******前言******* 我数一下,我发了几个帖子,1.2.3? 哈哈哈,没几个哈,感谢吾爱,让我学到了很多,乐于分享,共同进步! ...
- 【C进阶】之动态内存分配及内存操作函数
动态内存分配及内存操作函数 1 动态内存分配的介绍 2 malloc和free函数 3 测试代码 4 goto的使用场合,常用于出错处理 5 memset() 6 memcpy() 7 memcmp( ...
最新文章
- 中国小品演员都要卷舌?
- 怎么用php制作会员注册表单,帝国CMS前台会员登陆表单的制作教程
- 十七、去年jQuery的笔记
- 061 hive中的三种join与数据倾斜
- html去掉父元素样式,CSS清除浮动使父级元素展开的三个方法
- jmeter异步请求测试_使用JMeter对异步HTTP / REST服务进行压力/负载测试
- HTH的完整形式是什么?
- linux磁盘调度算法
- oracle 常用语句汇总
- 如何简单的理解TDD与DDT
- Android USBCamera投屏 - 利用UVC协议将手机上的画面有线投屏到Android车机的屏幕上
- 仿微信 即时聊天工具 - SignalR (一)
- 金属酞菁催化剂可促进氧还原反应
- 今日头条 Android ‘秒‘ 级编译速度优化
- #507 Wiggle Sort II
- AFD-0654: AFD is not supported on Exadata systems CRS-10001: Errors xxx.ko was not found
- Favicon.ico图片在线制作网站PHP源码+支持多种图片格式转换
- 搭档之家|打造信息交互平台,推进合作新发展
- matlab qpsk调试 rls均衡,通信系统仿真速成第2天:QPSK调制与解调(实验)
- 报错Error from chokidar (C:\): Error: EBUSY: resource busy or locked, lstat ‘C:\hiberfil.sys‘
热门文章
- linux下mysql日志管理及mysql备份还原
- 设计模式之桥接模式(Java语言描述)
- 黑马程序员————java线程之间的通信
- nagios监控服务短信报警开发及部署细节
- “scikit-learn(sklearn) 官方文档中文版”
- ubuntu挂载移动硬盘出现错误:mount:unknown filesystem type ‘exfat‘
- git 如何关联多个库
- 【转载】线段树 区间合并 小结
- 4.XXE (XML External Entity Injection)
- 纯css3实现瀑布流布局