2015-01-21 1 views
0

Я думаю, что этот код просачивается, если только внешний replace1() кто-то удаляет память, выделенную cc = new [....], можете ли вы подтвердить?Происходит ли утечка этого кода, если использование функции relace1() не удаляет память, выделенную cc?

char* replace1(char *c){ 
    if(c == NULL) return NULL; 
    int len = strlen(c); 
    if(len == 0) return NULL; 
    int cnt = 0; 
    for(int i=0; i<len; ++i) 
    { 
     if(c[i] == ' ') 
      ++cnt; 
    } 
    char *cc = new char[len+2*cnt+1]; 
    int p = 0; 
    for(int i=0; i<len; ++i) 
    { 
     if(c[i] == ' ') 
     { 
      cc[p] = '%'; 
      cc[p+1] = '2'; 
      cc[p+2] = '0'; 
      p += 3; 
     } 
     else 
     { 
      cc[p] = c[i]; 
      ++p; 
     } 
    } 
    cc[p] = '\0'; 
    return cc; 
} 
+2

Неправильная практика возврата выделенной памяти - вместо этого вы можете использовать unique_ptr (shared_ptr) –

+0

@Dieter Lücking: Плохая практика может заключаться в работе с выделенной памятью с использованием * голых указателей *, в отличие от использования 'unique_ptr' или' shared_ptr '. Нет ничего плохого в * возврате * выделенной памяти как таковой. Можно также указать, что вопрос только номинально C++. Это имеет смысл и в вопросе C. – AnT

ответ

1

Ваша функция передает указатель на выделенную память обратно на вызывающий код. Он передает получателю этой памяти. Это означает, что функция не течет, предполагая, что вызывающий код получает указатель и отслеживает его (и в конечном итоге освобождает память).

Другими словами, в этом коде нечего подозревать утечку. Из перспективы предотвращения утечки памяти нет ничего плохого в этом коде.

Если ваша программа протекает в этой памяти, это ошибка вызывающего кода, а не неисправность этой функции.

1

Этот код не протекает, сама по себе, но оставить его для вызывающей replace1() в delete[], что память, или иначе это будет утечка.

0

Нет, этот код не просачивается - он возвращает ресурс. Все в порядке.

В качестве части документации для этой функции должно быть что-то вроде: возвращает динамически выделенную память; вызывающий должен освободить результат.

Если кто-то наружу не освобождает ресурс, то это будет утечка, но вне кода не в этой функции.

Смежные вопросы