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

hung2412

Thành viên tích cực
Tham gia ngày
5 Tháng tám 2008
Bài viết
872
Được thích
218
Điểm
735
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

VetMini

Chuyên gia GPE
Tham gia ngày
21 Tháng mười hai 2012
Bài viết
10,126
Được thích
12,265
Điểm
1,560
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.
 

batman1

Thành viên gạo cội
Tham gia ngày
8 Tháng chín 2014
Bài viết
3,537
Được thích
5,387
Điểm
560
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?
 

VetMini

Chuyên gia GPE
Tham gia ngày
21 Tháng mười hai 2012
Bài viết
10,126
Được thích
12,265
Điểm
1,560
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"
 

hung2412

Thành viên tích cực
Tham gia ngày
5 Tháng tám 2008
Bài viết
872
Được thích
218
Điểm
735
Cảm ơn các bạn. Có ai nói cụ thể hơn được không ạ?
 

Ba mười ba

Thành viên chính thức
Tham gia ngày
10 Tháng tám 2020
Bài viết
93
Được thích
44
Điểm
20
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ã.
 

Ba mười ba

Thành viên chính thức
Tham gia ngày
10 Tháng tám 2020
Bài viết
93
Được thích
44
Điểm
20
...
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
 

Ba mười ba

Thành viên chính thức
Tham gia ngày
10 Tháng tám 2020
Bài viết
93
Được thích
44
Điểm
20
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.
 

hung2412

Thành viên tích cực
Tham gia ngày
5 Tháng tám 2008
Bài viết
872
Được thích
218
Điểm
735
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
 

Ba mười ba

Thành viên chính thức
Tham gia ngày
10 Tháng tám 2020
Bài viết
93
Được thích
44
Điểm
20
@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.
 

Ba mười ba

Thành viên chính thức
Tham gia ngày
10 Tháng tám 2020
Bài viết
93
Được thích
44
Điểm
20

SA_DQ

/(hông là gì!
Thành viên danh dự
Tham gia ngày
8 Tháng sáu 2006
Bài viết
11,842
Được thích
17,754
Điểm
1,860
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!
 

VetMini

Chuyên gia GPE
Tham gia ngày
21 Tháng mười hai 2012
Bài viết
10,126
Được thích
12,265
Điểm
1,560
@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.
 
Top Bottom