Tôi đã gặp lỗi khó chịu này đã biến mất trong quá khứ nhưng hiện tại sau một thời gian khá lâu nó quay trở lại.FastMM4 nói "Tiêu đề khối đã bị hỏng"
Tôi có hai đối tượng TSam (bắt nguồn từ TPersistent) được tạo và được nạp vào đối tượng TAsmJob (bắt nguồn từ TObjectList).
Khi chạy, biểu mẫu tạo TStringGrid và sau đó AsmJob tạo hai đối tượng SAM đó (và tải một số dữ liệu từ đĩa vào mỗi đối tượng). AsmJob cũng được gán cho lưới. Khi biểu mẫu bị hủy, Grid sẽ xử lý AsmJob bằng cách giải phóng nó, giải phóng các đối tượng TSam. Đây là vấn đề: đối tượng đầu tiên được giải phóng vấn đề withot nhưng cái thứ hai chết khi phương thức kế thừa của nó (trong Destroy destructor) được gọi.
Tôi sử dụng FreeAndNil trong toàn bộ chương trình để giải phóng các đối tượng. Các đối tượng TSam không phải là NIL !!!!! Vì vậy, đây là nỗ lực đầu tiên để giải phóng các đối tượng. Ngay cả dữ liệu bên trong các đối tượng đều nhất quán.
Xương sống của chương trình trông như thế này:
**Create:**
Form -> StringGrid
-> AsmJob -> Sam1, Sam2
StringGrid.AsmJob:= AsmJob;
**Free:**
Form -> StringGrid -> AsmJob -> Sam1, Sam2
Tôi thực sự không hiểu nơi tôi cố gắng gấp đôi miễn phí hoặc ghi đè lên các đối tượng sau khi nó đã được phát hành.
chỉnh sửa:
Một số lỗi tôi nhận:
FastMM đã phát hiện một lỗi trong một khối miễn phí hoạt động quét. FastMM phát hiện thấy một khối đã được sửa đổi sau khi được giải phóng.
FastMM đã phát hiện lỗi trong một hoạt động quét khối miễn phí . Tiêu đề khối đã bị hỏng.
Chi tiết:
The current thread ID is 0x19C, and the stack trace (return addresses) leading to this error is:
402E77 [System][@FreeMem]
4068DC [System][@DynArrayClear]
405E2D [System][@FinalizeArray]
405D31 [System][@FinalizeRecord]
40432F [System][TObject.CleanupInstance]
404272 [System][TObject.FreeInstance]
404641 [System][@ClassDestroy]
4D313E [UnitSam.pas][TSam.Destroy][297]
4042BF [System][TObject.Free]
4149ED [SysUtils][FreeAndNil]
4D9C0A [UnitAsmJob.pas][UnitAsmJob][TAsmJob.Destroy][180]
Tôi có tất cả "debug" tùy chọn kích hoạt trong IDE, trong đó có "Phạm vi kiểm tra". Ngoài ra, FastMM4 được đặt ở chế độ gỡ lỗi siêu tích cực. Nếu không có FastMM hoặc bên ngoài trình gỡ rối chương trình chỉ chạy tốt - nhưng tôi biết điều đó không có nghĩa là lỗi không còn ở đó nữa. Trên thực tế nó làm việc (có lẽ) trong hơn một năm, cho đến khi tôi đã cài đặt FastMM.
chỉnh sửa:
Nhờ tất cả mọi người. Không, tôi cảm thấy tôi đang di chuyển một chút theo hướng tốt.
Cấu trúc của chương trình phức tạp hơn Tôi chỉ cung cấp xương sống để giữ cho bài đăng gốc nhỏ. Nhưng những gì heck, nó đã lớn hơn :) Vì vậy, những đối tượng TSam được sử dụng để tải dữ liệu từ đĩa. Một tệp trong mỗi đối tượng. Họ cũng đang làm một số xử lý và xác nhận dữ liệu. Đối với mỗi TSam này tôi cũng có một đối tượng đồ họa hiển thị trên màn hình (đồ họa) dữ liệu chứa trong các đối tượng TSam. Mỗi dòng trong TStringGrid cũng hiển thị dữ liệu trong TSam, nhưng văn bản.
Một câu hỏi tôi có: nếu tôi phá vỡ chương trình thành từng phần nhỏ hơn để tìm ra lỗi, lỗi sẽ vẫn xuất hiện ở đâu? Hoặc chỉ có thể xuất hiện trong cấu hình cụ thể này?
Trả lời "làm thế nào để AsmJob được gán cho TStringGrid để TStringGrid phá hủy AsmJob, bạn có thể chỉ cho chúng tôi không?"
MyGrid = TStringGrid
public
AsmJob: TAsmJob;
end;
rồi đâu đó trong TForm.Create (dạng chứa Lưới), tôi làm
MyGrid.AsmJob=AsmJob;
và destructor của MyGrid tôi làm:
begin
FreeAndNil(AsmJob);
inherited
end;
Cảm ơn Alexander. Tôi không có đầu mối về "ScanMemoryPoolForCorruptions". Tôi đoán là một hàm được cung cấp bởi FastMM DLL. Tôi sẽ đi tìm kiếm về nó ngay bây giờ. – Ampere
Đó là hàm từ tiêu chuẩn FastMM4.pas. Nó là từ phiên bản độc lập hoàn toàn của FastMM. Nó không tồn tại trong phiên bản của FastMM, được tích hợp vào Delphi. Không có DLL được đề cập ở đây. Đây chỉ là một chức năng trong tập tin pas thông thường;) – Alex
Liên kết đáng buồn đã chết. Nhưng bạn có thể truy cập tại: http://web.archive.org/web/20091007162116/http://blog.eurekalog.com/?p=198 – EMBarbosa