加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

delphi – 通过指针修改字符串变量的内容是否安全?

发布时间:2020-12-15 09:35:55 所属栏目:大数据 来源:网络整理
导读:考虑我有一个带参数传递的Str参数的过程,我想通过过程修改给定变量的内容,例如 procedure Replace(var Str: string);var PStr: PChar; i: Integer;begin PStr := @Str[1]; for i := 1 to Length(Str) do begin PStr^ := 'x'; Inc(PStr); end;end; 这是一个可
考虑我有一个带参数传递的Str参数的过程,我想通过过程修改给定变量的内容,例如

procedure Replace(var Str: string);
var
  PStr: PChar;
  i: Integer;
begin
  PStr := @Str[1];
  for i := 1 to Length(Str) do begin
    PStr^ := 'x';
    Inc(PStr);
  end;
end;

这是一个可接受的指针用法吗?我不确定它是否有内存泄漏.

在PStr中真正发生了什么:= @Str [1],编译器是否在内部制作了Str的副本,或者是什么?

这种代码优化值得吗?

解决方法

Is it an acceptable pointer usage?

你需要确保不要打电话

PStr := @Str[1];

对于一个空字符串,因为它会崩溃.最简单的方法是用.替换该行

PStr := PChar(Str);

这样编译器就会确保返回指向字符串第一个字符的指针或指向#0的指针.正如肯在评论中正确指出的那样,在这种情况下没有调用UniqueString(),所以你需要自己做.

I’m not sure whether it has a memory leak.

不,没有内存泄漏.获取指向字符串字符的指针将在内部调用UniqueString(),但这也会发生对字符串字符的写访问,因此字符指针没有什么特别之处.

What really happen in PStr := @Str[1],does compiler make a copy of Str internally,or what?

不,它只是确保字符串是唯一的(因此通过指针的写访问不会更改共享相同数据的任何其他字符串的内容).然后它返回一个指向字符串中该字符的指针,然后您可以将其视为任何其他PChar变量,将其传递给API函数,递增它等等.

Is this kind of code optimization worth?

它不仅值得,它必须真正实现大字符串的良好性能.原因是编译器不够智能,只能调用一次UniqueString(),但是对于字符串中的字符的每次写访问,它都会插入调用.因此,如果逐个字符处理大字符串,那么所有这些调用都会产生很大的开销.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读