Изучаю списки GList. И решил тщательно рассмотреть освобождение памяти в конце использования Glist. И заметил что память не до конца освобождается. Текст программы - check_glib.c
#include <stdio.h>
#include <stdlib.h>
#include <glib.h>
#include <unistd.h>
#define N 5000
#define LEN 24000
int main(int argc, char **argv)
{
g_print("name = %s\n\n", argv[0]);
gchar * command = NULL;
command = g_new(gchar, 256);
sprintf(command, "perl ./script.pl %s\n", argv[0]);
GList *list = NULL;
gint i = 0;
gint j = 0;
gint l = 0;
gint *array;
for (i=0; i<N; i++) {
fprintf(stderr, " %d ", i+1);
list = NULL;
for(j=0; j<=i; j++) {
array = g_new(gint, LEN);
for(l=0; l<LEN; l++) {
array[l] = l;
}
list = g_list_append(list, (gpointer)array);
}
sleep(1);
fprintf(stderr, "| full: ");
system(command);
g_list_free_full (list, g_free);
sleep(1);
fprintf(stderr, "| free: ");
system(command);
fprintf(stderr, "\n");
}
g_free(command);
return 0;
}
Для мониторинга написал perl скрипт script.pl. Скрипт берет вывод утилиты с ключами ps aux - находит параметры RSS (Resident Set Size) и VSS (Virtual Set Size) для запущенной нами программы и только их выводит на экран.
Текст script.pl:
#!/usr/bin/perl
use strict;
use warnings;
# берем вывод утилиты ps и разбиваем на строки
my @ls1=split(/\n/,`ps aux | grep $ARGV[0]`);
# выбираем строчку вывода ps, которая не содержит слов grep и perl
my $line;
foreach my $tline (@ls1) {
if ( !($tline =~ m/grep/) and !($tline =~ m/perl/)) {
$line = $tline;
}
}
$line=~s/\s+/ /g; # удаление дублирующих пробелов
my @ls2=split(/ /,$line);
print STDERR "V $ls2[4] R $ls2[5] ";
И makefile для сборки:
# basic GTK+ app makefile
SOURCES = check_glib.c
PACKAGE = check_glib
OBJS = ${SOURCES:.c=.o}
CFLAGS = `pkg-config gtk+-3.0 --cflags`
LDADD = `pkg-config gtk+-3.0 --libs`
CC = gcc -Wall
all : ${OBJS}
${CC} -o ${PACKAGE} ${OBJS} ${LDADD}
.c.o:
${CC} ${CFLAGS} -c $<
clean:
rm *.o ${PACKAGE}
# end of file
Сейчас покажу часть вывода программки у меня:
46 | full: V 16156 R 6540 | free: V 12032 R 2592
47 | full: V 16344 R 6540 | free: V 12032 R 2592
48 | full: V 16344 R 6804 | free: V 12032 R 2592
49 | full: V 16532 R 6804 | free: V 12032 R 2592
50 | full: V 16532 R 6804 | free: V 12032 R 2592
51 | full: V 16720 R 7068 | free: V 12032 R 2592
52 | full: V 16720 R 7068 | free: V 16720 R 7248
53 | full: V 16908 R 7248 | free: V 16816 R 7340
54 | full: V 17004 R 7340 | free: V 16816 R 7376
55 | full: V 17004 R 7376 | free: V 16816 R 7376
56 | full: V 17188 R 7596 | free: V 16816 R 7376
Здесь видно что с 52 шага - память стала освобождаться не вся. При этом заметил, что память как бы осталась зарезервированной, и при следующем шаге память выделяется используя также зарезервированную часть.
В общем меня этот момент с памятью удивил и заинтересовал. Кто-нибудь может объяснить что происходит с памятью?