Утечка памяти при инициализации строки

Обновить

November 2018

Просмотры

146 раз

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;
}

Случай 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;
}

3 ответы

3

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

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

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

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.
4

str = "string";

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

strcpy(str,"string");

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

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