2016-12-21 4 views
1

Случай 1: Я написал следующее гр программы и когда я проверил на утечки памяти я утечки памяти на этой линии str = (char*)malloc(10); даже когда я написал заявление, чтобы освободить ту памятьУтечка памяти при инициализации строки

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 

int main() 
{ 
    char *str; 
    str = (char*)malloc(10); 
    str = "string"; 
    printf("length : %ld\n",strlen(str)); 
    free(str); 
    return 0; 
} 

Case 2:

Когда я заменил str="string"strcpy(), утечки не возникает, почему это так?

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 

int main() 
{ 
    char *str; 
    str = (char*)malloc(10); 
    strcpy(str,"string"); 
    printf("length : %ld\n",strlen(str)); 
    free(str); 
    return 0; 
} 
+2

Случай 1 показывает неопределенное поведение: вы не называете 'free()' тем же указателем, который вы получили из 'malloc()'. Если в случае 2 вы это делаете. –

+1

1) 'str =" string ";' Он был перезаписан указателем на строковый литерал. – BLUEPIXY

+0

кейс1. 'str =" string "' - неверно, потому что это не операция с копией; должен быть 'strcpy (str," string ")' как в случае2 – nikniknik2016

ответ

3

И не то же самое.

В этом случае strcpy(str, "string") - это правильный способ скопировать строку "str" ​​на str. str выделяется, тогда вы освобождаете его. поэтому нет утечки памяти.

В случае str = "string" память, выделенная str, будет потеряна, и это приведет к утечке памяти.

2
str = (char*)malloc(10); 
str = "string"; <-- You just lost the pointer to the malloced memory. ie. memory leak. 
free(str); <-- Here you are trying to free the `"string"` itself. Not possible. 
+0

да, я попытался освободить эту память, но я получил munmap_chunk() error –

+1

yes Я попытался освободить эту память, но у меня возникла ошибка munmap_chunk(), и у меня появилась причина, по которой это происходит, поэтому только эти указатели могут быть бесплатными по бесплатной функции, которая return by malloc и его функция friend, которые являются calloc, realloc поблагодарить u за вашу помощь –

+0

@sanketjoshi: это правильно! – 599644

4

str = "string";

После этого str указывает на другую ячейку памяти (на многих платформах она будет только для чтения памяти). Поэтому он больше не указывает на память, которую вы выделили через malloc. Когда вы вызываете free(str), вы пытаетесь освободить некоторую память, которую вы не предполагаете. Это неопределенное поведение. Он ничего не может сделать, иначе может произойти сбой. И просочилась память.

strcpy(str,"string");

Здесь строка копируется уже выделенную память, на который указывает str. У вас есть эта память, вы скопировали данные, а затем освободили ее. Поэтому здесь нет проблем.

Таким образом, основное различие между двумя случаями заключается в том, что в первом случае str указывает на другое место, чем выделенное.

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