zoukankan      html  css  js  c++  java
  • Delphi 内存分配 StrAlloc New(转)

    源:Delphi 内存分配 StrAlloc New

    引自:http://anony3721.blog.163.com/blog/static/5119742010824934164/
     
    给字符指针(PChar、PWideChar、PAnsiChar)分配内存, 最佳选择是: StrAlloc.
    StrAlloc 虽然最终也是调用了 GetMem, 但 StrAlloc 会在指针前面添加 Delphi 需要的 4 个管理字节(记录长度).
    StrAlloc 分配的内存, 用 StrDispose 释放, 用 StrBufSize 获取大小.
    用 FreeMem 释放可以吗? 这样会少释放 4 个字节.

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


    var
    p: PChar;
    begin

    p := StrAlloc(256);
    GetWindowText(Handle, p, StrBufSize(p));
    ShowMessage(p); {Form1}
    StrDispose(p);
    end;
    还有一对非常重要的相关函数: GlobalAllocPtr、GlobalFreePtr; 它们的功能是上面这些都不可替代的!
    GlobalAllocPtr 和 GlobalFreePtr 是对系统函数: GlobalAlloc、GlobalFree 的简化, 之所以说它们重要, 只是因为它们可以跨进程操作; 不过 GlobalAllocPtr 是给无类型指针(Pointer)分配内存, 当然就不仅仅用于字符指针了.
     
    New 是给已知大小的指针分配内存; 
    GetMem 主要是给无类型指针分配内存;
    尽量使用 GetMemory 来代替 GetMem.
    关于 FreeMemory 与 FreeMem 的区别: 
    1、FreeMemory 会检查是否为 nil 再 FreeMem, 这有点类似: Free 与 Destroy;
    2、FreeMem 还有个默认参数可以指定要释放的内存大小, 不指定就全部释放(没必要只释放一部分吧);
    3、New 对应的 Dispose 也可以用 FreeMem 或 FreeMemory 代替.
    尽量使用 FreeMemory 来释放 GetMem、GetMemory、AllocMem、ReallocMem、ReallocMemory 分配的内存.
    ReallocMem、ReallocMemory 是在已分配的内存的基础上重新分配内存, 它俩差不多 ReallocMemory 比 ReallocMem 多一个 nil 判断, 尽量使用 ReallocMemory 吧.
    好的代码像粥一样,都是用时间熬出来的
  • 相关阅读:
    c++ 单步查看汇编代码【转】
    c++ 类内部函数调用虚函数
    grep和sed替换文件中的字符串【转】
    vim 正则替换【转】
    linux 文件编码问题
    shell截取字符串的一些简单方法
    chrome 安装页面编码选择插件
    namespace main
    【转】c++ 多线程
    使用git提交到github,每次都要输入用户名和密码的解决方法
  • 原文地址:https://www.cnblogs.com/jijm123/p/14258841.html
Copyright © 2011-2022 走看看