Как отследить, сколько памяти просочилось? - PullRequest
3 голосов
/ 19 октября 2011

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

Мои общие мысли о программе заключаются в том, чтобы постоянно переназначать указатель malloc.

Вот мой код:

char *oldMemory = malloc(125000); //1MB of memory.
char *newMemory = malloc(125000);
oldMemory = newMemory;
  • Есть ли способпоместите это в цикл и постоянно теряйте определенное количество памяти до тех пор, пока программа не сможет больше выделять память и происходит сбой?
  • Как я могу отследить, сколько памяти просочилось до сбоя программы?

Спасибо за ваше время и знания!

Ответы [ 2 ]

4 голосов
/ 19 октября 2011
  1. Да.
  2. Подсчитайте размер утечек.

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

Следовательно:

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

enum { ALLOCSIZE = 125000 };

int main(void)
{
    long long size = 0;
    char *space = malloc(ALLOCSIZE);
    while (space != 0)
    {
        size += ALLOCSIZE;
        printf("OK %lld\n", size);
        memset(space, '\0', ALLOCSIZE);
    }
    return(0);
}

В OOM Linux могут возникать проблемы;это позволяет чрезмерное использование памяти.Вы должны были бы получить доступ к выделенной памяти перед ее утечкой - отсюда memset() (или вы могли бы использовать calloc() вместо malloc()).

0 голосов
/ 19 октября 2011

когда вы выделяете какой-то блок памяти в C, вы должны нести ответственность за его освобождение, используя free() функция.
если вы хотите убедиться, что ваша программа не потерпит крах из-за утечек памяти.
Вы можете использовать функцию assert() при запросе дополнительной памяти или использовании выделенной памяти.
и вы должны проверить возвращаемый указатель, возвращенный из malloc, если он равен NULL, поэтому выделение не удалось. >> Будьте осторожны в ядрах Linux malloc() никогда не вернет NULL из-за "переполнения памяти"

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