无效的指针操作

时间:2009-06-30 17:39:52

标签: delphi openfiledialog

我的表单包含TOpenDialog组件(OpenDialog1)和一个按钮。 OpenDialog1ofAllowMultiSelectOptions)属性设置为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,消息'无效的指针操作'。”

原因是什么,我该如何纠正?

3 个答案:

答案 0 :(得分:22)

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

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

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

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

答案 1 :(得分:3)

你应该检查

if FileExists(OpenDialog1.Files[I]) then begin

而不是

if FileExists(OpenDialog1.FileName) then begin

更好地投资于持有该价值的本地变量。

为什么会这样?

OpenDialog1.Files.Free;

答案 2 :(得分:2)

文件由TOpenDialog拥有,不应直接释放。