Nhờ giúp viết Code cách check các biến chưa được giải phóng khỏi bộ nhớ

Liên hệ QC

hung2412

Thành viên tích cực
Tham gia
5/8/08
Bài viết
905
Được thích
239
Giới tính
Nam
Xin chào các bạn GPE!
Tôi có 1 vấn đề sau: Sau khi chạy thủ tục Sub thì có Code nào check các biến chưa được giải phóng khỏi bộ nhớ không?
Mã:
Sub Check_cac_bien_chua_duoc_giai_phong_khoi_bo_nho()
Dim i as Long
Dim t as Long
Dim k as String

... Code ...

End Sub
Mong các bạn giúp cho.
 

File đính kèm

  • Check bien chua duoc giai phong khoi bo nho.xls
    27.5 KB · Đọc: 6
VBA sử dụng reference counting để quản lý biến và bộ nhớ, giản dị hơn garbage collection nhiều.
Mọi thứ đằng sau Excel được Microsoft viết bằng C++
Muốn biết về ba cái này thì ở GPE có một chuyên viên nổi tiếng về tài viết lại các routines của Microsoft để tăng tốc. Hỏi người này hy vọng sẽ có câu trả lời.

Tên và thành tích nhơn vật này, làng C++ ai cũng biết. Nếu không biết đến thì đừng có mở miệng đòi dạy 200 đô một tiết.
 
Upvote 0
Tên và thành tích nhơn vật này, làng C++ ai cũng biết. Nếu không biết đến thì đừng có mở miệng đòi dạy 200 đô một tiết.
Nếu tôi không lầm, tức theo danh sách đăng ký, thì 2 "nhơn" vật này cùng dự sinh nhật GPE Sài Gòn mà. Hay là đã không có màn giao lưu, ngồi vào bàn cũng không ai tự giới thiệu?
 
Upvote 0
Nếu tôi không lầm, tức theo danh sách đăng ký, thì 2 "nhơn" vật này cùng dự sinh nhật GPE Sài Gòn mà. Hay là đã không có màn giao lưu, ngồi vào bàn cũng không ai tự giới thiệu?
Tại trước đó hỏng có ai hỏi "nhờ viết code cho hai đỉnh cao C++ nhận ra nhau khi đối diện trong bữa tiệc"
 
Upvote 0
Cảm ơn các bạn. Có ai nói cụ thể hơn được không ạ?
 
Upvote 0
Làm thế nào để biết các biến chưa được giải phóng khỏi bộ nhớ sau khi chạy Code?
 

File đính kèm

  • Check bien chua duoc giai phong khoi bo nho.xls
    27.5 KB · Đọc: 5
Upvote 0
Cảm thấy quá buồn câu hỏi hết sức là đơn giản nhưng đến giờ vẫn chưa có câu trả lời thỏa mã.
 
Upvote 0
...
Mã:
Sub Phong_Thi_Nghiem(Bien As Variant)
    If IsEmpty(Bien) Then
       MsgBox "[Bien] này vẫn còn trong trắng !"
    Else
       MsgBox "[Bien] này đã bị sử dụng !"
    End If
End Sub

Sub Tét_Bien_1()
    Dim Bien As Variant
    '---------> Côt
    Phong_Thi_Nghiem Bien
End Sub

Sub Tét_Bien_2()
    Dim Bien As Variant
    '---------> Côt
    Bien = "Anh ơi tối nay mình gặp nhau nhé !"
    Phong_Thi_Nghiem Bien
End Sub
 
Upvote 0
IsEmpty có đồng nghĩa với "chưa giải phóng" không?
Cháu cũng đang định hỏi bạn ấy "giải phóng" là như thế nào ? Mục đích rõ ràng cụ thể ?
Nhưng hỏi nhiều lại sợ làm phiền đến bạn ấy do đó mà cháu viết thí dụ để bạn test xem thế nào rồi phản hồi lại để biết tình hình.
 
Upvote 0
Cháu cũng đang định hỏi bạn ấy "giải phóng" là như thế nào ? Mục đích rõ ràng cụ thể ?
Nhưng hỏi nhiều lại sợ làm phiền đến bạn ấy do đó mà cháu viết thí dụ để bạn test xem thế nào rồi phản hồi lại để biết tình hình.
"Giải phóng" có nghĩa là:
Mã:
Dim i as long => i=Empty
Dim k as String => k=Empty
Dim t as Variant => t=Empty
Dim Wb As Workbook => Set Wb=Nothing
Dim Arr()  => Erase Arr
Dim rng as Range => Set rng=Nothing
Dim Dic As Object => Set Dic=Nothing
 
Upvote 0
@ptm0412 đấy như vậy cháu cũng hiểu sơ ý muốn của bạn ấy, 3 cái biến này:
Dim i as Long
Dim t as Long
Dim k as String

Như vậy cháu sử dụng IsEmpty là đúng ý của bạn ấy rồi đớiii.
 
Upvote 0
Ẩn tàng bên trong câu hỏi là "tất cả biến" và "tất cả kiểu biến". @Ba mười ba gói dép chuẩn bị bỏ chạy là vừa

Cháu biết sức của cháu nên cháu chỉ trả lời theo yêu cầu của #1 chú ạ, hết "biến" lại mọc thêm "hình" thì cháu phải chạy thôi..
@chủ thớt tham khảo thêm:

1600959094377.png
 
Upvote 0
Chỉ những người ăn chay trường mới trả lời được vấn đề này thôi.

Chúc mọi người ngon giấc mùa thu!
 
Upvote 0
@ptm0412 đấy như vậy cháu cũng hiểu sơ ý muốn của bạn ấy, 3 cái biến này:
Dim i as Long
Dim t as Long
Dim k as String

Như vậy cháu sử dụng IsEmpty là đúng ý của bạn ấy rồi đớiii.
Bạn chưa trả lời về mấy cái Objects. Mấy cái này mới là khùng.

Set rg = Range(gì gì đó)
Set rg = Nothing chỉ có nghĩa là không chỉ rg vào cái Range gì gì đó nữa. Nhưng cái Range gì gì đó nó thuộc về Worksheet và Workbook, đâu đã "giải phóng" khỏi bộ nhớ?
Loại biến này chỉ giải phóng vì sợ để đó bị ảnh hưởng cái Range mà nó chỉ vào thôi (lỡ tay đặt Value = cái gì đó). Chứ về bộ nhớ thì nó chỉ chiếm vài bytes.

Loại biến chỉ vào cái đối tượng (Object) được dựng ra mới quan trọng với bộ nhớ.
Set Dic = Nothing có nghĩa là bứt cái Dic ra khỏi cái đối tượng (object) mà nó đang chỉ vào. Đâu có bảo đảm "giải phóng" cái đối tượng ấy đâu?
Một thằng nợ nhiều nhà băng. Một vài nhà băng xoá nợ không có nghĩa là thằng ấy sạch nợ.
VBA dùng reference count để đếm số này. Chỉ khi nào số count này là 0 thì VBA mới tin là đối tượng đã được "tự do". Và lúc ấy nó mới tính chuyện lấy lại bộ nhớ.
Điển hình:
Set Dic = CreateObject("CaiGiDo") ' dựng đói tượng theo lớp CaiGiDo, ref count ở đây là 1
... code nhét đầy cỡ vài GB vào Dic
Set Dic2 = Dic ' chỉ Dic2 vào đối tượng kia, ref count ở đây là 2
Set Dic = Nothing ' bứt Dic ra, ref count ở đây là 1, vì thằng Dic2 còn sờ sờ kia
... code gì thì cứ code
' cái đối tượng kia vẫn sừng sững chiếm vài GB vì VBA đâu thể dẹp nó. Mỗi lần VBA hỏi thăm thì nó trả lời "ref count của tao vẫn đang > 0"
Set Dic2 = Nothing ' bứt Dic2 ra, bây giờ thì ref count là 0 (nếu không còn thằng nào nữa)
... code gì đó đòi hỏi bộ nhớ
' VBA sẽ lại hỏi cái đối tượng kia, và lần này thì nó trả lời "tao đi chầu Phật đây, mày cứ việc lây lại cái đống bọ nhớ kia
' bấy giờ cái chỗ bộ nhớ kia mới thực sự được tính là phơ-ri.

Ví dụ trên thì đếm dễ rồi. Vì các ref's đều trực tiếp. Mọi việc sẽ rối như tơ vò nếu có việc chỉ-qua-chỉ-lại (cross references)
Điển hình là đối tượng ADO thỉnh thoảng bị VBA đếm nhầm ref count, Excel đơ luôn.

Bảo tôi code cái này thì tôi chịu. Hơi đâu bỏ cả tuần lễ (có thể đến cả tháng, tôi học chậm lắm) đi tìm tài liệu rồi viết mấy cái sub's để làm chuyện từ thiện. Cả tháng ấy thà đi viết code dạo, lấy tiền đem vào bệnh viện giúp người nghèo mua thuốc có lẽ còn nhiều "công đức" hơn.

Nhưng ở trên tôi đã mách cho một chuyên viên C++. Tôi tin là người này có khả năng làm nhanh và tốt hơn tôi. Những điều y khoe về trình độ C++ đều thật cả. Và tôi có nói rõ với thớt rồi, không biết y là ai thì chỉ là tay mơ trong làng C++. Đừng có mở miệng khoác lác cái vụ C++ 200 đô một tiết, nghe nực cười lắm.
 
Upvote 0
Web KT
Back
Top Bottom