C++, použití free()

pe25tr

C++, použití free()
« kdy: 04. 09. 2013, 13:00:47 »

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čí:
free(p)
nebo se musí opačně:

for (i = 0; i < ni; i++) {
  for (j = 0; j < nj; j++)
    free(p[i][j]);
  free(p[i]);
}
free(p);

?

Dík.


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 »
Citace od: hawran diskuse 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

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

:-D

prezek

  • ***
  • 229
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 »
Citace od: prezek kdy 04. 09. 2013, 15:29:23
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.

Citace od: prezek 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ů?
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 »
Citace od: asdfasdf kdy 04. 09. 2013, 13:10:16
ty radsi nic neprogramuj a jdi zametat chodniky

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

prezek

  • ***
  • 229
Re:C++, použití free()
« Odpověď #13 kdy: 05. 09. 2013, 08:44:41 »
Citace od: student kdy 04. 09. 2013, 16:11:58
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 »
Citace od: prezek kdy 05. 09. 2013, 08:44:41
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