Delphi指针操作无效,是哪里出了问题,能否详细解释一下?

2026-04-10 18:312阅读0评论SEO问题
  • 内容介绍
  • 文章标签
  • 相关推荐

本文共计501个文字,预计阅读时间需要3分钟。

Delphi指针操作无效,是哪里出了问题,能否详细解释一下?

我有一个包含TOpenDialog组件(OpenDialog1)和一个按钮的表单。OpenDialog1的ofAllowMultiSelect属性设置为true。单击按钮后,将执行AddFilesToListView方法:

procedure TForm4.AddFilesToListView;var Lis: TStringList;begin // 方法内容end;

Delphi指针操作无效,是哪里出了问题,能否详细解释一下?

我有一个包含TOpenDialog组件(OpenDialog1)和一个按钮的表单.
OpenDialog1将ofAllowMultiSelect(of Options)属性设置为true.

单击该按钮后,将执行AddFilesToListView方法:

procedure TForm4.AddFilesToListView(); var ListItem : TListItem; I: Integer; F : File; LengthOfAudio : TDateTime; previousCursor : TCursor; begin previousCursor := Self.Cursor; Self.Cursor := crHourGlass; if OpenDialog1.Execute then begin for I := 0 to OpenDialog1.Files.Count - 1 do begin if FileExists(OpenDialog1.FileName) then begin ListItem:=ListView1.Items.Add; ListItem.Caption := 'Test'; ListItem.SubItems.Add(ExtractFileName(OpenDialog1.Files[I])); ListItem.SubItems.Add(ExtractFilePath(OpenDialog1.Files[I])); end else raise Exception.Create('File does not exist.'); end; end; Self.Cursor := previousCursor; OpenDialog1.Files.Free; end;

在运行应用程序时,选择第一个文件,我没有问题,但是当想要选择第二个文件时,我收到一条错误,说“Project project3引发了一个异常类EInvalidPointer,消息’无效的指针操作’.”

造成这种情况的原因是什么,我该怎么做?

“无效的指针操作”意味着您释放了不属于您的内存.其中一个原因是:

>你的程序释放了之前已经释放过的东西.
>你的程序释放了一些从未分配过的东西.
>您的程序释放了使用不同内存管理器分配的内容.

在您的代码中,您将释放TOpenDialog的Files属性.您没有分配该字符串列表,并且文档没有告诉您释放它,因此期望列表实际属于对话框组件是合理的,并且组件将在需要时释放它.检查Dialogs.pas中的源代码确认了这一点.由于您还释放了该对象,因此您有一个双重自由错误,它符合我上面列出的第一个标准.删除该行.

作为Uwe pointed out,您还处理文件名列表,但仅检查是否存在文件名.这是程序中的逻辑错误,但它不会导致您看到的异常.

本文共计501个文字,预计阅读时间需要3分钟。

Delphi指针操作无效,是哪里出了问题,能否详细解释一下?

我有一个包含TOpenDialog组件(OpenDialog1)和一个按钮的表单。OpenDialog1的ofAllowMultiSelect属性设置为true。单击按钮后,将执行AddFilesToListView方法:

procedure TForm4.AddFilesToListView;var Lis: TStringList;begin // 方法内容end;

Delphi指针操作无效,是哪里出了问题,能否详细解释一下?

我有一个包含TOpenDialog组件(OpenDialog1)和一个按钮的表单.
OpenDialog1将ofAllowMultiSelect(of Options)属性设置为true.

单击该按钮后,将执行AddFilesToListView方法:

procedure TForm4.AddFilesToListView(); var ListItem : TListItem; I: Integer; F : File; LengthOfAudio : TDateTime; previousCursor : TCursor; begin previousCursor := Self.Cursor; Self.Cursor := crHourGlass; if OpenDialog1.Execute then begin for I := 0 to OpenDialog1.Files.Count - 1 do begin if FileExists(OpenDialog1.FileName) then begin ListItem:=ListView1.Items.Add; ListItem.Caption := 'Test'; ListItem.SubItems.Add(ExtractFileName(OpenDialog1.Files[I])); ListItem.SubItems.Add(ExtractFilePath(OpenDialog1.Files[I])); end else raise Exception.Create('File does not exist.'); end; end; Self.Cursor := previousCursor; OpenDialog1.Files.Free; end;

在运行应用程序时,选择第一个文件,我没有问题,但是当想要选择第二个文件时,我收到一条错误,说“Project project3引发了一个异常类EInvalidPointer,消息’无效的指针操作’.”

造成这种情况的原因是什么,我该怎么做?

“无效的指针操作”意味着您释放了不属于您的内存.其中一个原因是:

>你的程序释放了之前已经释放过的东西.
>你的程序释放了一些从未分配过的东西.
>您的程序释放了使用不同内存管理器分配的内容.

在您的代码中,您将释放TOpenDialog的Files属性.您没有分配该字符串列表,并且文档没有告诉您释放它,因此期望列表实际属于对话框组件是合理的,并且组件将在需要时释放它.检查Dialogs.pas中的源代码确认了这一点.由于您还释放了该对象,因此您有一个双重自由错误,它符合我上面列出的第一个标准.删除该行.

作为Uwe pointed out,您还处理文件名列表,但仅检查是否存在文件名.这是程序中的逻辑错误,但它不会导致您看到的异常.