Tôi hiện đang cố gắng mã hóa một chương trình con nhỏ ở Fortran để phân bổ tất cả các biến được phân bổ trong bộ nhớ khi chương trình của tôi gặp lỗi, tức là không thể tải tệp hoặc tệp không cần thiết. Tại thời điểm này, thực hiện phải được chấm dứt, nhưng không phải tất cả các allocatables nhất thiết phải được phân bổ (nó phụ thuộc vào nơi trên mã lỗi xuất hiện), vì vậy tôi không thể làm cho một dọn dẹp deallocating tất cả chúng.Fortran DEALLOCATE
cách tiếp cận hiện tại của tôi là như sau:
SUBROUTINE Cleanup(A)
REAL(8), ALLOCATABLE, DIMENSION(:) :: A
IF (ALLOCATED(A)) THEN
DEALLOCATE(A)
END IF
END SUBROUTINE
và gọi là "Cleanup" cho mỗi allocatable. Vấn đề với điều này là không phải tất cả các biến của tôi là thứ nguyên-1. Tôi có tới ba chiều trong một số trong số chúng.
Lần đầu tiên tôi nghĩ đến việc viết 3 chương trình con khác nhau cho các kích thước khác nhau và sử dụng quá tải, nhưng điều này không có vẻ rất thanh lịch. Sau đó tôi nghĩ rằng có lẽ tôi có thể vượt qua một con trỏ thay vì đối số actuall A, nhưng tôi đã googled và có vẻ như bạn không thể deallocate một biến mục tiêu máng một con trỏ.
Bất kỳ ý tưởng nào về cách thực hiện điều này đúng cách?
Cảm ơn.
Khi thực thi được chấm dứt, tất cả các tài nguyên được mã của bạn sử dụng sẽ tự động được giải phóng theo bất kỳ cách nào, vì vậy bạn không phải lo lắng về việc giải quyết rõ ràng chúng. –
Tôi biết Fortran sẽ tự động giải phóng bộ nhớ, nhưng trong trường hợp này tôi đang viết một dll được gọi từ Labview, vì vậy đây là ai đang quản lý bộ nhớ. Khi dll đến một lỗi, Labview đột nhiên dừng lại, và nếu tôi cố gắng thực hiện lại, nó sẽ hiển thị thông báo: "Array đã được cấp phát" và tắt. Điều này có nghĩa là bộ nhớ không được xử lý đúng cách. – derkomai
Lưu ý: 'thực (8)' không được bảo đảm là 8 byte. Một cách di động là 'sử dụng ISO_FORTRAN_ENV',' real (real64) 'cho 64 bit. –