Język C i niezwolniona pamięć

Odpowiedz Nowy wątek
2011-09-02 01:42
Newb
0

Witam,
Mam następującą wątpliwość: piszę program w C, intensywnie korzystam z dynamicznej alokacji pamięci, na przykład ładuje struktury na listę. Jak wiadomo niezwolniona pamięć powoduje wyciek jeśli program dalej działa, jeśli nie to zależy od systemu operacyjnego.

  1. Czy warto zadbać o ręczne zwolnienie dynamicznie zaalokowanej pamięci jeśli mamy pewność, że zrobi to system? IMO jest to korzystne estetycznie (podobnie jak zamykanie plików tuż przed return 0). Myślałem o przechwytywaniu sygnału SIGQUIT i uruchamianiu procedury zwalniającej pamięć. Jak do tej sprawy podchodzą doświadczeni programiści?

Pozdrawiam,

Pozostało 580 znaków

2011-09-02 02:02
0

Zwalnianie pamięci to jest po prostu dobra praktyka. Czasem też lepiej nie liczyć na system, a nóż będzie coś zbugowane. Możesz też nie wiedzieć jak długo Twój program będzie działał, więc wyciek może doprowadzić użytkownika do zmiany programu na coś alternatywnego.


A nóż widelec? ;) - somekind 2011-09-02 02:16
bo lepiej bez łyżki niż bez zupy - massther 2011-09-02 09:25
Ale mając łyżkę możesz z kotka zrobić rękawiczki. A zupą nic nie zrobisz. - somekind 2011-09-02 11:33
No tak, a zima się zbliża - byku_guzio 2011-09-02 18:43

Pozostało 580 znaków

2011-09-02 11:48
1

Jeżeli to prosty program możesz spróbować użyć jakiegoś GC. Testowałem libgc i działał nawet sprawnie. Szybki niezbyt miarodajny test, ale pokazuje że działa:

#include <stdio.h>
#include <stdlib.h>
#include <gc/gc.h>
#define malloc GC_malloc
void zajmij(){
  int *wsk=malloc(sizeof(int)*2000);
  wsk[0]=3;
  int i;
  for(i=1; i<2000; i++){ //pętla taka zagmatwana żeby optymalizator jej nie wywalił
    wsk[i]=wsk[i-1] + rand()%100-50;
  }
  printf("%d\n", wsk[1999]);
}
 
int main(void){
  int i=10000;
  while(i--)
    zajmij();
  getchar(); //by zatrzymać program i móc obejrzeć zajętość pamięci w monitorze systemu
  return 0;
}

kompilowane poleceniem:
gcc test.c -lgc -O2

Jak widać tylko malloc, bez free. Po wykonaniu całej pętli program w ramie zajmuje niecałe 300KiB. Jak zakomentuję definicję malloc na GC_malloc zużycie rośnie do 78MiB.

Ten trick działa też z C++ i klasami, ale w Qt mi się go nie udało użyć.
http://linux.die.net/man/1/libgc

Jest pewnie gdzieś port pod Cygwina i MinGWa.

Pozostało 580 znaków

2011-09-02 14:12
Newb
0

Okay. Podziękował.

Pozostało 580 znaków

2011-09-02 14:46
0

Więcej na ten temat było niedawno w "fekaliowym" wątku: http://4programmers.net/Forum/C_i_C++/111661-po_co_niszczyc_przy_zamykaniu_programu

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0