首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >德尔福AnsiString操纵- PAnsiChar变得腐败?

德尔福AnsiString操纵- PAnsiChar变得腐败?
EN

Stack Overflow用户
提问于 2013-02-22 01:28:37
回答 1查看 1.9K关注 0票数 1

我使用以下方法通过和操作AnsiString。它大部分时间都能工作,但有时指向字符串的指针退出了工作。考虑到以下代码:

代码语言:javascript
复制
var
  s: AnsiString;
  p: PAnsiChar;
  offset, idx, cnt: Integer;
begin
  s := 'some>very>long>string>with>field>delimiters>';
  p := @s[1];
  offset := 1;

  // find the 5th field
  cnt := 5;
  repeat
    idx := AnsiString.AnsiPos('>', p);
    Inc(p, idx);
    Inc(offset, idx);
    Dec(cnt);
  until cnt = 0;

  // insert a new field after the 5th field
  Insert(AnsiString('something new>'), s, offset);

  // skip other fields
  // insert other values
  // repeat
end;

调试时,在repeat..until循环完成后,您可以查看检查器并查看p = 'field>delimiters>'。在Insert()语句之后,s = 'some>very>long>string>with>something new>field>delimiters>'p = 'something new>field>delimiters>'在检查器中。这是意料之中的。

我的真正的字符串是几千字长。这种通过字符串并添加新字段的方法工作了数十次,然后突然停止工作。p不再显示调用Insert()后字符串前面插入的值。p似乎不知道s改变了..。

为什么p在大多数Insert()语句之后正确引用s上的字符,并在调用Insert()之后突然停止工作

)我在打字时发现了我问题的答案。答案现在看来是显而易见的,但在我努力解决这个问题的时候却不是这样。也许贴出这个问题和答案会对其他人有所帮助。)

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-02-22 01:31:57

调用Insert()时,如果没有足够的额外连续内存来扩展当前内存位置的缓冲区,内存管理器将将AnsiString移动到内存中的新位置。这使得p指向旧的内存位置,该位置不包含修改过的字符串,很可能导致访问冲突。

在每个p语句修复问题后,添加一行代码来重新初始化Insert()

代码语言:javascript
复制
var
  s: AnsiString;
  p: PAnsiChar;
  offset, idx, cnt: Integer;
begin
  s := 'some>very>long>string>with>field>delimiters>';
  p := @s[1];
  offset := 1;

  // find the 5th field
  cnt := 5;
  repeat
    idx := AnsiString.AnsiPos('>', p);
    Inc(p, idx);
    Inc(offset, idx);
    Dec(cnt);
  until cnt = 0;

  // insert a new field after the 5th field
  Insert(AnsiString('something new>'), s, offset);
  p := @s[offset];                                 // <- this fixes the issue

  // skip other fields
  // insert other values
  // repeat
end;
票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15015376

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档