2011-12-06 32 views
8

Im viết phần mở rộng Ruby và Im sử dụng hàm Data_wrap_struct.Data_wrap_struct và đánh dấu chức năng

Để tham gia vào quá trình thu gom rác và đánh dấu của Ruby, tôi cần phải xác định một thường trình để giải phóng cấu trúc của tôi, và thường trình đánh dấu bất kỳ tham chiếu nào từ cấu trúc của tôi đến các cấu trúc khác. Tôi vượt qua chức năng cổ điển free để giải phóng bộ nhớ nhưng tôi không biết cách sử dụng chức năng đánh dấu.

cấu trúc của tôi âm thanh như thế này

typedef struct 
{ 
    int x; 
    int y; 
} A; 

typedef struct 
{ 
    A collection[10]; 
    int current; 
} B; 

Tôi nghĩ rằng tôi cần một chức năng đánh dấu để đánh dấu các tài liệu tham khảo trong collection của struct B.

Ai đó có thể cho tôi một ví dụ để xem cách một chức năng đánh dấu công trinh?

Trả lời

6

Hàm đánh dấu được sử dụng để đánh dấu bất kỳ đối tượng Ruby Ruby mà cấu trúc C của bạn sở hữu.

typedef struct { 
    VALUE ruby_object; 
} MyStruct; 

void mark(void * p) { 
    /* p is the wrapped pointer to the MyStruct instance */ 
    MyStruct * my_struct = (MyStruct *) p; 
    rb_gc_mark(my_struct->ruby_object); 
} 

Nếu đối tượng thuộc sở hữu của cấu trúc của bạn không được đánh dấu, bộ thu gom rác có thể quét và mã của bạn có thể sẽ cố gắng sử dụng đối tượng cuối cùng.

+1

Tôi có cần đánh dấu các đối tượng không phải là Ruby được tham chiếu bởi các đối tượng Ruby khác không? Trong trường hợp của tôi, tôi có một cây vật dụng được tạo bởi các lớp Ruby khác (với các tham chiếu đến chúng). – lzap

+0

@Izap, no. Hàm 'mark' được sử dụng để báo cho bộ thu gom rác của Ruby về ** các đối tượng Ruby ** được tạo từ mã bên ngoài đến máy ảo Ruby, chẳng hạn như phần mở rộng C. Nếu bạn có trong tay một đối tượng Ruby tạo ra các đối tượng không phải là Ruby khác, bạn có thể muốn thực hiện một hàm 'miễn phí' giải phóng tài nguyên khi đối tượng Ruby được thu thập rác. –

Các vấn đề liên quan