выделение памяти с тем же идентификатором - PullRequest
1 голос
/ 15 сентября 2011
#include<stdio.h>
#include<stdlib.h>
int main()
{
    char *temp;
    while(1)
    {
        temp= malloc(sizeof(char)*10);
        /*some code*/
    }
}

Мой вопрос: я выделял память в каждом цикле с одинаковым именем. Что будет с предыдущей выделенной памятью; и поскольку мы создаем переменные с одинаковым идентификатором, почему мы не получаем никаких ошибок?

PS: не спрашивайте, что я делаю в этом коде. Я делал какой-то другой код и по ошибке сделал это. Просто измените его и задайте мою проблему.

Ответы [ 5 ]

3 голосов
/ 15 сентября 2011

что будет с предыдущей выделенной памятью.

Будет потеряно навсегда. Это то, что называется « утечка памяти ».

и так как мы создаем переменные с одинаковым идентификатором, почему мы не получаем никаких ошибок

Это не ошибка компиляции. Компилятор не следует вашей логике, только ваш синтаксис. Перезапись значений в порядке с компилятором.

3 голосов
/ 15 сентября 2011

Это называется утечка памяти .У тебя нет возможности освободить память, так что она потеряна для тебя.

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

1 голос
/ 15 сентября 2011

Выделенная ранее память будет вытекать, так как она не освобождается и ее адрес теряется для программы.Вы не получаете никаких ошибок, потому что вы не создаете переменные с одним и тем же идентификатором, вы выделяете разные куски памяти и сохраняете указатель на них в одной и той же временной переменной.как вы, кажется, путаете переменные с памятью.

0 голосов
/ 15 сентября 2011

Здесь temp - указатель, а не идентификатор.
Так что temp указывает на память, выделенную моим malloc.

Таким образом, когда вы выделяете новую память и используете ЖЕ указатель, чтобы указать на вновь выделенную память, она НЕ ДОЛЖНА указывать старый выделенный блок памяти, и он теряется навсегда. Итак, у вас есть утечка памяти .

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

#include<stdio.h>
#include<stdlib.h>
int main()
{
    char *temp;
    while(1)
    {
        temp= malloc(sizeof(char)*10);
        /*some code*/

        /* free the memory pointed by temp */
        free(temp);
    }
}

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

Обновление:
Также вы можете использовать один и тот же блок памяти, на который указывает temp во всем цикле. Нет необходимости перераспределять в каждой итерации.
И если вы не хотите сохранять старую память, вы можете просто использовать memset, например,

#include<stdio.h>
#include<stdlib.h>
int main()
{
    /* allocate memopry only once */
    char *temp = malloc(sizeof(char)*10);

    while(1){
        /* zero out the memory so no old data is left */
        memset((void*)temp, 0, sizeof(char)*10);

        /* some code that uses temp */
    }

    /* free the allocated memory */
    free(temp);
}
0 голосов
/ 15 сентября 2011

Компилятор в большинстве случаев не обнаруживает логические ошибки, такие как эта, когда программист выделяет память, но никогда не освобождает ее.

Это то, что мы называем «утечкой памяти».

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...