# Gsub! memory leak

**URL:** <https://www.ruby-forum.com/t/gsub-memory-leak/144837>\
**Category:** Development\
**Created:** [August 2, 2008, 10:26pm UTC](https://www.ruby-forum.com/t/gsub-memory-leak/144837 "2008-08-02T22:26:35Z")\
**Posts on this page:** 1\
**Page:** 1

<div class="post-metadata">

**Author:** ![shinichiro.h](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/s/34f0e0/32.png) [@shinichiro.h](https://www.ruby-forum.com/u/shinichiro.h)\
**Post date:** [August 2, 2008, 10:26pm UTC](https://www.ruby-forum.com/t/gsub-memory-leak/144837/1 "2008-08-02T22:26:35Z")

</div>

e$BIMCO$H$$$$$^$9!#e(B

yarvtest/runner.rb e$B$,e(B valgrind e$B$KE$i$l$k$h$&$J$N$Ge(B  
e$B=$@5$7$F$_$^$7$?!#0J2\<$G:F8=$9$k$_$?$$$G$9!#e(B

% cat leak.rb  
val = ‘$(RUBY\_SO\_NAME)-static.a’  
val.gsub!(/RUBY\_SO\_NAME/, ‘h’)  
% valgrind --leak-check=full ./ruby1.9 leak.rb

# Index: string.c

— string.c (revision 18321)  
+++ string.c (working copy)  
@@ -617,6 +617,9 @@  
cr = ENC\_CODERANGE(str2);  
rb\_str\_modify(str);  
if (OBJ\_TAINTED(str2)) OBJ\_TAINT(str);

- if (!STR\_SHARED\_P(str) && !STR\_EMBED\_P(str)) {
- xfree(RSTRING\_PTR(str));
- }  
if (RSTRING\_LEN(str2) \<= RSTRING\_EMBED\_LEN\_MAX) {  
STR\_SET\_EMBED(str);  
memcpy(RSTRING\_PTR(str), RSTRING\_PTR(str2), RSTRING\_LEN(str2)+1);  
@@ -625,9 +628,6 @@  
ENC\_CODERANGE\_SET(str, cr);  
return;  
}

- if (!STR\_SHARED\_P(str) && !STR\_EMBED\_P(str)) {
- xfree(RSTRING\_PTR(str));
- }  
STR\_SET\_NOEMBED(str);  
STR\_UNSET\_NOCAPA(str);  
RSTRING(str)-\>as.heap.ptr = RSTRING\_PTR(str2);
