C++, použití free()

pe25tr

C++, použití free()
« kdy: 04. 09. 2013, 13:00:47 »
Kód: [Vybrat]
double ***p

p = (double***) malloc(ni * sizeof(double**));
for (i = 0; i < ni; i++) {
  p[i] = (double**) malloc(nj * sizeof(double*));
  for (j = 0; j < nj; j++)
    p[i][j] = (double*) malloc(nk * sizeof(double));
}

stačí:
Kód: [Vybrat]
free(p)nebo se musí opačně:
Kód: [Vybrat]
for (i = 0; i < ni; i++) {
  for (j = 0; j < nj; j++)
    free(p[i][j]);
  free(p[i]);
}
free(p);
?

Dík.
« Poslední změna: 04. 09. 2013, 13:34:06 od Roman Bořánek »


asdfasdf

Re:free()
« Odpověď #1 kdy: 04. 09. 2013, 13:10:16 »
ty radsi nic neprogramuj a jdi zametat chodniky

JSH

Re:free()
« Odpověď #2 kdy: 04. 09. 2013, 13:16:20 »
Je třeba volat free pro každý malloc. free nijak neanalyzuje, co je uložené v paměti, kterou uvolňuje. Mohla by tam být klidně čísla, která vypadají jako ukazatele.

pe25tr

Re:C++, použití free()
« Odpověď #3 kdy: 04. 09. 2013, 13:36:20 »
Děkuji ;).

Re:C++, použití free()
« Odpověď #4 kdy: 04. 09. 2013, 14:23:00 »
Just to be clear: Being called a ThreeStarProgrammer is usually not a compliment.

http://c2.com/cgi/wiki?ThreeStarProgrammer


spartakus

Re:C++, použití free()
« Odpověď #5 kdy: 04. 09. 2013, 14:57:21 »
Just to be clear: Being called a ThreeStarProgrammer is usually not a compliment.

http://c2.com/cgi/wiki?ThreeStarProgrammer

Citace
one would occasionally find a piece of code done by a three-star programmer and shiver with awe.

 :-D

prezek

  • ***
  • 229
    • Zobrazit profil
Re:C++, použití free()
« Odpověď #6 kdy: 04. 09. 2013, 15:29:23 »
Mohli byste mi stručně říct, co je špatného na ukazateli na pole ukazatelů na pole doublů? Proč není tříhvězdičkový programátor kompliment?

student

Re:C++, použití free()
« Odpověď #7 kdy: 04. 09. 2013, 15:47:17 »
Snaz sa robit cim menej mallocov - ak to ide. Defaultny malloc alokuje casto nie prilis dobre zarovnane adresy v pamati, ma nejaku reziu (musi si niekam zapisat, kolko toho alokoval) a niekedy vyzaduje syscall, co je zabijak vykonu.

Tu to ide nahradit jednym mallocom alebo este lepsie v C++ pomocou jedneho new.

student

Re:C++, použití free()
« Odpověď #8 kdy: 04. 09. 2013, 16:11:58 »
Proč není tříhvězdičkový programátor kompliment?
To je dobry priklad tak na skusku - ale beznemu programatorovi sa to necita dobre "ako rozpravka". A ked ja musim rozmyslat aj nad tym, co vlastne programator kodom myslel*, tak mi neostava tolko kapacity mozgu na rozmyslanie nad tym, co ten kod robi.

Mimo tento problem je problem aj s vykonom, ako som uz pisal o prispevok vyssie.

Mohli byste mi stručně říct, co je špatného na ukazateli na pole ukazatelů na pole doublů?
To ti naozaj znie dobre? Vedel by si si hned predstavit abstrakciu za tym a vobec dovod takeho odkazovania? Netvrdim, ze to musi byt vzdy zle - urcite sa to skor bude podobat trileru ako rozpravke na dobru noc.

Mimo to, spominane double ***p; si predstavim ako ukazatel na ukazatel na ukazatel na double. A to je uz same dost zahmlene. Interpretacia "pointer je pole" je dost nepriezracna a nevidim dovod, preco to pisat takto.

iwtu

Re:C++, použití free()
« Odpověď #9 kdy: 04. 09. 2013, 18:09:53 »
Keby sa tie hviezdicky pisali na druhu stranu, tak vznikne p*** :D

mhi_

Re:C++, použití free()
« Odpověď #10 kdy: 04. 09. 2013, 23:53:05 »
Ze zkusenosti bych rekl, ze lide, kteri umi pouzivat ***p vetsinou umi i psat efektivni algoritmy (ne tak, ze pouziji STL, ktere je dobre na standardizovane veci, ale kdyz jde napr. o nejaky specificky parser tak je potreba mozek a ne chytrou knihovnu).

Programu s trojnasobnymi pointery jsem napsal uz desitky. Ono to neni o te obskurnosti, ale obcas je lepsi u vicerozmernych datovych struktur pouzit to ***p nez nejake p
  • [y][z]. U programu, ktery prochazi milionkrat nejaka data je potom kazda neoptimalizovana operace znat. Ani gcc neprijde na vsechno ;-).


Nepovazuji se za zadneho super programatora.

noname

Re:C++, použití free()
« Odpověď #11 kdy: 05. 09. 2013, 01:37:22 »
Můžu mít nesmělý polozačátečický dotaz?  ;)
Proč, když už se jedná o C++ používat malloc() a free(), když lze využít přehlednější operátory new a delete? Je zde nějaký rozdíl v imlementaci, či výkonu nebo se je nepodstatné který způsob alokování paměti využiji?
Díky za odpověď.

noname

Re:free()
« Odpověď #12 kdy: 05. 09. 2013, 01:40:07 »
ty radsi nic neprogramuj a jdi zametat chodniky

Každý nějak začíná.  >:(

prezek

  • ***
  • 229
    • Zobrazit profil
Re:C++, použití free()
« Odpověď #13 kdy: 05. 09. 2013, 08:44:41 »
Mimo to, spominane double ***p; si predstavim ako ukazatel na ukazatel na ukazatel na double. A to je uz same dost zahmlene. Interpretacia "pointer je pole" je dost nepriezracna a nevidim dovod, preco to pisat takto.

stačí se podívat pár řádků pod double ***p; a je jasné, že je to myšleno jako trojrozměrné pole. Jak vyrobit efektivněji 3D pole s přístupem k prvkům pomocí p
  • [y][z]?

gamer

Re:C++, použití free()
« Odpověď #14 kdy: 05. 09. 2013, 08:59:49 »
Jak vyrobit efektivněji 3D pole s přístupem k prvkům pomocí p
  • [y][z]?
boost::multi_array
http://www.boost.org/doc/libs/1_54_0/libs/multi_array/doc/user.html