# \[Bug:trunk\] memory leak of Class#dup

**URL:** <https://www.ruby-forum.com/t/bug-trunk-memory-leak-of-class-dup/178971>\
**Category:** Development\
**Created:** [November 14, 2009, 1:54pm UTC](https://www.ruby-forum.com/t/bug-trunk-memory-leak-of-class-dup/178971 "2009-11-14T13:54:19Z")\
**Posts on this page:** 2\
**Page:** 1

<div class="post-metadata">

**Author:** ![Yusuke\_ENDOH](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/y/c89c15/32.png) [@Yusuke\_ENDOH](https://www.ruby-forum.com/u/Yusuke_ENDOH)\
**Post date:** [November 14, 2009, 1:54pm UTC](https://www.ruby-forum.com/t/bug-trunk-memory-leak-of-class-dup/178971/1 "2009-11-14T13:54:19Z")

</div>

e$B1sF#$G$9!#e(B

Class#dup e$B$,%a%b%j%j!\<%/$9$k$h$&$G$9!#e(B  
class C; end; loop { C.dup } e$B$G;HMQ%a%b%j$,=y!9$KA}$($F$-$^$9!#e(B

object.c e$B$Ne(B init\_copy e$B$He(B class.c e$B$Ne(B rb\_mod\_init\_copy  
e$B$Ge(B RCLASS\_IV\_TBL e$B$re(B  
e$BFs=E$K3NJ]$7$F$$$k$N$H!"8E$$e(B RCLASS\_M\_TBL  
e$B$r2rJ|$7$F$$$J$$$3$H$,860x$Ne(B  
e$B$h$&$G$9!#e(B

e$B0J2\<$N%Q%C%A$GD\>$j$^$9$,!“e(Binit\_copy e$B$He(B rb\_mod\_init\_copy  
e$B$N;H$$J,$1$,NI$/e(B  
e$BJ,$+$i$J$$$N$G!”@5$7$$$+J,$+$j$^$;$s!#e(B  
e$BJQ$J$3$H$r$7$J$1$l$P$?$V$sIaDL$KF0$/$H;W$&$N$Ge(B (loop { C.dup }  
e$B$bJQ$G$9e(B  
e$B$,e(B) e$B!"0lC6%3%\_%C%H$7$h$&$H;W$$$^$9!#e(B

diff --git a/class.c b/class.c  
index a97494b…056e171 100644  
— a/class.c  
+++ b/class.c  
@@ -151,6 +151,9 @@ rb\_mod\_init\_copy(VALUE clone, VALUE orig)  
if (RCLASS\_IV\_TBL(orig)) {  
ID id;

- if (RCLASS\_IV\_TBL(clone)) {
- 

```
 st_free_table(RCLASS_IV_TBL(clone));

```

- }  
RCLASS\_IV\_TBL(clone) = st\_copy(RCLASS\_IV\_TBL(orig));  
CONST\_ID(id, “ **classpath** ”);  
st\_delete(RCLASS\_IV\_TBL(clone), (st\_data\_t\*)&id, 0);  
@@ -159,6 +162,11 @@ rb\_mod\_init\_copy(VALUE clone, VALUE orig)  
}  
if (RCLASS\_M\_TBL(orig)) {  
struct clone\_method\_data data;
- 
- if (RCLASS\_M\_TBL(clone)) {
- 

```
 extern void rb_free_m_table(st_table *tbl);

```

- 

```
 rb_free_m_table(RCLASS_M_TBL(clone));

```

- }  
data.tbl = RCLASS\_M\_TBL(clone) = st\_init\_numtable();  
data.klass = clone;  
st\_foreach(RCLASS\_M\_TBL(orig), clone\_method,  
diff --git a/gc.c b/gc.c  
index f472bfc…9de079b 100644  
— a/gc.c  
+++ b/gc.c  
@@ -1459,8 +1459,8 @@ free\_method\_entry\_i(ID key, rb\_method\_entry\_t  
\*me, st\_data\_t data)  
return ST\_CONTINUE;  
}

-static void  
-free\_m\_table(st\_table \*tbl)  
+void  
+rb\_free\_m\_table(st\_table \*tbl)  
{  
st\_foreach(tbl, free\_method\_entry\_i, 0);  
st\_free\_table(tbl);  
@@ -1988,7 +1988,7 @@ obj\_free(rb\_objspace\_t \*objspace, VALUE obj)  
case T\_MODULE:  
case T\_CLASS:  
rb\_clear\_cache\_by\_class((VALUE)obj);

- free\_m\_table(RCLASS\_M\_TBL(obj));

- rb\_free\_m\_table(RCLASS\_M\_TBL(obj));  
if (RCLASS\_IV\_TBL(obj)) {  
st\_free\_table(RCLASS\_IV\_TBL(obj));  
}

---

<div class="post-metadata">

**Author:** ![Yusuke\_ENDOH](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/y/c89c15/32.png) [@Yusuke\_ENDOH](https://www.ruby-forum.com/u/Yusuke_ENDOH)\
**Post date:** [November 14, 2009, 1:57pm UTC](https://www.ruby-forum.com/t/bug-trunk-memory-leak-of-class-dup/178971/2 "2009-11-14T13:57:50Z")

</div>

e$B%A%1%C%He(B #2367 e$B$,99?7$5$l$^$7$?!#e(B (by Yusuke E.)

e$B%9%F!\<%?%9e(B Opene$B$+$ie(BClosede$B$KJQ99e(B  
e$B?JD=e(B % 0e$B$+$ie(B100e$B$KJQ99e(B

This issue was solved with changeset r25768.  
Yusuke, thank you for reporting this issue.  
Your contribution to Ruby is greatly appreciated.  
May Ruby be with you.

* * *

[http://redmine.ruby-lang.org/issues/show/2367](http://redmine.ruby-lang.org/issues/show/2367)
