zoukankan      html  css  js  c++  java
  • Delphi中复制带有String的记录结构时不能使用Move之类的内存操作函数

    请看下面的代码: 

    program TestRecord;

    {$APPTYPE CONSOLE}

    uses
      SysUtils,
      Math;

    type
      TRecordA = record
        Name: string;
      end;

    procedure RunTestRecord;
    var
      R1, R2: TRecordA;
    begin
      R1.Name := StringOfChar('A', RandomRange(64, 256) * 1024);
      Move(R1, R2, SizeOf(R1));
    end;

    var
      I: Integer;
    begin
      try
        for I := 0 to 100000 - 1 do
          RunTestRecord;
      except
        on E:Exception do
          Writeln(E.Classname, ': ', E.Message);
      end;
    end.

    由于结构中有String类型,红色部分进行了复制操作,结果复制后R2和R1中的Name指向同一块内存,导致释放出现错误,最后堆栈溢出。

    因此在遇到结构复制时一定要使用=进行复制,千万不要使用内存操作函数。

    最容易犯错误的时候就是复制结构数组,为了方便可能就直接内存拷贝,结果就会引发错误!

    http://blog.csdn.net/missmecn/article/details/7099316

  • 相关阅读:
    css3 box-shadow
    JS的Document属性和方法
    简单配色方案web
    ps中参考线的使用技巧
    min-width() ie6
    js 模拟右键菜单
    display:table-cell
    js opener 的使用
    js的 new image()
    CSS 中文字体 Unicode 编码方案
  • 原文地址:https://www.cnblogs.com/findumars/p/5290063.html
Copyright © 2011-2022 走看看