Hi,

In message "Mem leaks in rb_str_become?"
    on 02/07/04, Michal Rokos <m.rokos / sh.cvut.cz> writes:

|	I'm not sure is following code doesn't mem leaks...

|-    VALUE str = rb_obj_alloc(klass);
|-
|+    VALUE str;
|+    
|     if (len < 0) {
| 	rb_raise(rb_eArgError, "negative string size (or size too big)");
|     }
|-
|+    
|+    str = rb_obj_alloc(klass);

OK.

|     if (ptr) {
| 	memcpy(RSTRING(str)->ptr, ptr, len);
|+    } else {
|+	memset(RSTRING(str)->ptr, '\0', len);
|     }

OK, but using MEMZERO() macro.

| str_new3(klass, str)
|     VALUE klass, str;
| {
|-    VALUE str2 = rb_obj_alloc(klass);
|-
|+    VALUE str2;
|+    
|+    Check_Type(str, T_STRING);

str should alway be T_STRING, so no check is needed here.

|+    Check_Type(orig, T_STRING);

ditto.

|-    str = rb_str_buf_new(len + STR_BUF_MIN_SIZE);
|+    str = rb_str_buf_new(len);

OK.

|     if (NIL_P(str2)) {
|-	RSTRING(str)->ptr = 0;
|+	RSTRING(str)->ptr = 0; /* FIXME: MEM LEAKs here ???*/

Yes.  It was leaking.  I should have moved 

    if (!FL_TEST(str, ELTS_SHARED)) free(RSTRING(str)->ptr);

before updating RSTRING(str)->ptr.

Thank you for the changes.  I will commit them.

							matz.