Portál AbcLinuxu, 6. května 2025 16:17

Dotaz: Uvolňování paměti při ukončení programu

Jardík avatar 11.2.2011 13:10 Jardík | skóre: 40 | blog: jarda_bloguje
Uvolňování paměti při ukončení programu
Přečteno: 277×
Odpovědět | Admin
Zdravím, na gtk-devel-list mailing listu se rozvynula vášnivá diskuse ohledně uvolňování paměti při ukončení programu. Abych to shrnul, začalo to příspěvkem, že při ukončení programu (gtkmm)
int main (int argc, char *argv[])
{
      Gtk::Main *app = new Gtk::Main (&argc, &argv);
      delete app;
      return 0;
}
není uvolněna veškerá alokované paměť a že jsou tam tedy memory leaky. Problém je ale ve fungování glib a GTK, nikoliv v GTKMM. Vypadá nějak takto
int main(int argc, char **argv)
{
  gtk_init(&argc, &argv);
  // dělej něco tady
  gtk_main();
  return 0;
}

Po ukončení smyčky běžící v gtk_main() je tedy program ukončen a věci alokované v gtk_init (a v jí volaných fcí) a pak v dalších funkcích třeba gtk_widget_get_type() (skryté za makrem GTK_TYPE_WIDGET), funkcích jako g_warning(), prostě nejsou uvolněny a je to necháno operačnímu systému.

Padly argumenty typu "nemá cenu to uvolňovat a zdržovat ukončení programu, když to stejně uklidí OS" a že "je to knihovna neurčená k několikanásobnému natahování do paměti a tak není třeba při ukončení programu nic uvolňovat". Dalších pár lidí zase tvrdilo, že je slušnost si po sobě uklízet a že by bylo dobré mít (třeba i volitelnou) funkci typu gtk_cleanup(), také kvůli lepší detekci leaků, které nastanou v samotné aplikaci mimo GTK.

Do diskuse jsem se nazapojil a nejsem asi schopen posoudit, co je lepší - mít o trochu zjednodušené API a nechat uklízet OS, nebo uklízet sám. Uklízet u knihoven, co jsou po celou dobu "životnosti" programu v paměti, nebo ne?

Věřím v jednoho Boha.

Řešení dotazu:


Nástroje: Začni sledovat (0) ?Zašle upozornění na váš email při vložení nového komentáře.

Odpovědi

11.2.2011 13:30 JS
Rozbalit Rozbalit vše Re: Uvolňování paměti při ukončení programu
Odpovědět | | Sbalit | Link | Blokovat | Admin
Viz tez tuto diskusi. Strucne, nazory se ruzni. Ja jsem spis zastance uklizeni a korektniho ukonceni, protoze:

1. Programator tim dava najevo, ze vi, co kde ma, a tedy ze rozumi programu, a ze je tedy spis napsan korektne.

2. Nikdy nevite, kde vas kod skonci - pokud skonci v serveru nebo nejakem dlouho bezicim procesu, muze to byt problem.

3. Existuji nastroje na detekci leaku, a v takovem pripade tohle muze zbytecne prekazet (podobne jako neodstraneny nevinny warning pri kompilaci).
12.2.2011 16:16 Sten
Rozbalit Rozbalit vše Re: Uvolňování paměti při ukončení programu
Odpovědět | | Sbalit | Link | Blokovat | Admin
Korektní uvolňování u OOP (které GTK implementuje) je důležité a mělo by se striktně dodržovat, protože systém potom sice uklidí, ale destruktory nezavolá a to se potom „velmi dobře“ ladí.

A největší problém je u programů, které GTK načtou jenom na chvíli (třeba kvůli vytvoření PDF) a potom jej zase uvolní, ale paměť zůstane naalokovaná. Knihovna by si po sobě měla umět uklidit.

Založit nové vláknoNahoru

Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.