.[ ČeskéHry.cz ].
Dealokace
Jdi na stránku Předchozí  1, 2, 3  Další
 
odeslat nové téma   Odpovědět na téma    Obsah fóra České-Hry.cz -> C / C++
Zobrazit předchozí téma :: Zobrazit následující téma  
Autor Zpráva
Aroidzap



Založen: 14. 11. 2011
Příspěvky: 68

PříspěvekZaslal: 12. červenec 2012, 18:11:56    Předmět: Odpovědět s citátem

citace:
alokoval jsem pro ty char* o jeden char min nez jsem zapisoval


resenim byla alokace o 1 char vic Smile

pak jsem to uz smazal timto zpusobem :

kód:
for (unsigned int i=0;i<tag_array->size();i++)
{
   delete[] tag_array->at(i).parameters;
   delete[] tag_array->at(i).type_name;
}

delete tag_array;


-> if.then
diky za krasne vysvetleni Wink


Naposledy upravil Aroidzap dne 12. červenec 2012, 18:17:34, celkově upraveno 1 krát
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
manutara



Založen: 02. 01. 2012
Příspěvky: 81
Bydliště: Kosice SVK

PříspěvekZaslal: 12. červenec 2012, 18:16:22    Předmět: Odpovědět s citátem

citace:
resenim byla alokace o 1 char vi


hmm, takze klasika posledny prvok pola ``pole[10]'' je ``pole[9]''...
_________________
hadam to OpenGL este par rokov prezije


Naposledy upravil manutara dne 12. červenec 2012, 18:17:29, celkově upraveno 1 krát
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
if.then



Založen: 13. 04. 2008
Příspěvky: 579

PříspěvekZaslal: 12. červenec 2012, 18:17:27    Předmět: Odpovědět s citátem

Ne, ne, ne a ne! Dealokuješ jen to, cos alokoval! *facepalm*

Přečti si pořádně celé tohle téma a pochopíš, co děláš špatně.

Jinak literaly mají na konci terminating zero (\0), takže fakt potřebuješ o jeden charakter víc, než zapisuješ.

EDIT: rezna, sám bych to lépe nenapsal.
_________________
For guns and glory, go to www.ceske-hry.cz.
For work and worry, execute VC++.


Naposledy upravil if.then dne 12. červenec 2012, 18:21:27, celkově upraveno 1 krát
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Aroidzap



Založen: 14. 11. 2011
Příspěvky: 68

PříspěvekZaslal: 12. červenec 2012, 18:19:23    Předmět: Odpovědět s citátem

to vim, ale rikam ze to nechapu, proc to pred tim nejelo, cele je to zvlastni

proste jsem pridal o char navic pri alokaci a zmizel problem pri dealokaci

jinak to vim za kazdej string ma nulovej znak, byla to spis chyba z nepozornosti, ktera mi unikla, protoze to vse jelo, a delalo to chybu u te dealokace, kdyby to bylo u zapisu tak me to docvakne hned


Naposledy upravil Aroidzap dne 12. červenec 2012, 18:21:08, celkově upraveno 1 krát
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
rezna



Založen: 27. 07. 2007
Příspěvky: 2150

PříspěvekZaslal: 12. červenec 2012, 18:19:28    Předmět: Odpovědět s citátem

@Aroidzap boze chlapce - ty se ucis C++ a resis ze 'char*' o neco rychlejsi nez 'std::string'. no to je fakt vysmech. ty nemas sanci to poznat. ten rozdil poznas az budes miliony operaci na retezcich za sekundu a ne pri nejakym uceni se C++

nauc se to co nejjednosusseji. zjevne ani nemas tucha o tom jako 'char*' funguje a bude pro tebe jednodussi zacit se std::string, abys vubec nekam dosel.

takhle se snazis naucis se strilet pistole tak, ze sis vzal do ruky stredoveky delo a miris si mezi oci, ale tvrdis pritom, ze delo je lepsi, protoze toho vic pozabiji nez pistole. ano mas pravdu. ale jak je videt z tveho zpusobu psani kodu (btw - ten kod jsi sem nedal - jaksi ho sem dej cely, protoze dat sem 2 radky a to hlavne ty, ktere nebyly problematicke je fakt spatnej vtip) tak si tim delej za chvili ustrelis palici (cti, budes psat programy plne segfaultu, ktere budou jenom umet padat (a dokonce o par milisekund driv nez bez 'char*'))
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Aroidzap



Založen: 14. 11. 2011
Příspěvky: 68

PříspěvekZaslal: 12. červenec 2012, 18:23:17    Předmět: Odpovědět s citátem

no dobre, tak se omlouvam, jen jsem zadal o pomoc...
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
rezna



Založen: 27. 07. 2007
Příspěvky: 2150

PříspěvekZaslal: 12. červenec 2012, 18:36:49    Předmět: Odpovědět s citátem

my se ti ale snazime pomoct - uz nekolik dni do tebe hustime at prestanes vymyslet hlouposti a zacnes se ucit jednoduse a od zakladu - nedas si rict a vymyslis vetsi a vetsi blbosti (protoze neznas zaklady ...)
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
manutara



Založen: 02. 01. 2012
Příspěvky: 81
Bydliště: Kosice SVK

PříspěvekZaslal: 13. červenec 2012, 06:01:33    Předmět: troska kodu, alokace dealokace Odpovědět s citátem

offTopic

nieje to sice C++, ale na pochopenie mozno pomoze
kód:
#include <stdlib.h>
#include <stdio.h>
#include <io.h>

typedef struct{
   char *type_name;
   char *parameters;

   signed int subtags;
   
   unsigned int start;
   unsigned int end;
}tag_struct;

int main(int argc, char **argv)
{
   tag_struct *tag1=NULL;

//alokuje miesto pre strukturu=================================
   if((tag1=malloc(sizeof(tag_struct)))==NULL){
      fprintf(stderr,"\nerror -> malloc() for tag_struct\n");
      return 0;
   }
//=============================================================

   tag1->type_name=NULL;
   tag1->parameters=NULL;

   {
      unsigned int i=0;
      unsigned int size_name=0x40000000;   //1GB
      unsigned int size_param=0x2BC00000;   //0x2BC00000==700MB

//======alokuje miesto pre ukazatele v strukture=====================
      if((tag1->type_name=malloc(sizeof(char)*size_name))==NULL){
         printf("\nerror -> malloc() for type_name\n");
      }
      if(tag1->type_name!=NULL){
         for(i=0; i<size_name; i++){
            tag1->type_name[i]='A';
         }
         printf("\n");
         write(2,tag1->type_name,18);
         getc(stdin);
      }

      if((tag1->parameters=malloc(sizeof(char)*size_param))==NULL){
         printf("\nerror -> malloc() for type_name\n");
      }
      if(tag1->parameters!=NULL){
         for(i=0; i<size_param; i++){
            tag1->parameters[i]='T';
         }
         printf("\n");
         write(2,tag1->parameters,18);
      }
//===================================================================

   }

//dealokuje ukazatele v struct=======
   getc(stdin);
   if(tag1->type_name!=NULL){
      free(tag1->type_name);
   }
   getc(stdin);
   if(tag1->parameters!=NULL){
      free(tag1->parameters);
   }
//====================================

//dealokuje celu struct===============
   getc(stdin);
   if(tag1!=NULL){
      free(tag1);
   }

   return 0;
}

je tam dost ``pre niekoho zbytocnych'' kontrol, ale takto som si zvykol.

staci zapnut ``task manager'' a vidiet ako to zabera a odobera pamat.
_________________
hadam to OpenGL este par rokov prezije
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
rezna



Založen: 27. 07. 2007
Příspěvky: 2150

PříspěvekZaslal: 13. červenec 2012, 06:39:44    Předmět: Odpovědět s citátem

to fprintf ti moc nepomuze ... - podivej se jak implementovanej operator 'new' - ten proste pekne hodi vyjimku a s tim uz se da pracovat

jinak jak rika kolega a ma pravdu - pokud to neni extra osetrene tak delat neco dal po tom kdyz malloc() vrati NULL ani nema smysl - protoze stejne neni pamet na alokaci chybovych hlasek a tak

pak je resenim zabrat 10-20MB pri startu, pri nemoznosti alokovat je uvolnit, zahlasit chybu (neb je ted kam alokovat) a konec ...
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
nou



Založen: 28. 07. 2007
Příspěvky: 1036

PříspěvekZaslal: 13. červenec 2012, 07:06:58    Předmět: Odpovědět s citátem

z mojich skusenosti vas OS zabije a k tej vynimke sa ani nedostanete. ono s virtualnou pametou a strankovanim si mozete naalokovat aj nasobky skutocnej fyzicej RAM. pritom v skutocnosti vam system tu pamet da az k nej pristupujete preto vam program padne uplne inde ako pri new/malloc
preto nevidim zmysel testovat vrateny pointer na NULL/osetrovat vynimku. asi jedine na nejakej embed platforme kde take vymozenosti ako virtualna pamet.
_________________
Najjednoduchšie chyby sa najtažšie hľadajú.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
manutara



Založen: 02. 01. 2012
Příspěvky: 81
Bydliště: Kosice SVK

PříspěvekZaslal: 13. červenec 2012, 07:44:21    Předmět: NULL Odpovědět s citátem

citace:
pritom v skutocnosti vam system tu pamet da az k nej pristupujete preto vam program padne uplne inde ako pri new/malloc
preto nevidim zmysel testovat vrateny pointer na NULL/osetrovat vynimku.


to je pravda, ale napr.
kód:
      if((tag1->type_name=malloc(sizeof(char)*size_name*20))==NULL){
         printf("\nerror -> malloc() for type_name\n");
      }
      printf("\nnoerror -> malloc() for type_name\n");

na vypise je
kód:
noerror -> malloc() for type_name
a program padne, cize ked alokujem 20GB pamate.

na druhej strane
kód:
      if((tag1->type_name=malloc(sizeof(char)*size_name*2))==NULL){
         printf("\nerror -> malloc() for type_name\n");
      }
      printf("\nnoerror -> malloc() for type_name\n");

na vypise je
kód:
error -> malloc() for type_name   !!!!!!!!!

noerror -> malloc() for type_name
a program skonci korenktne bez padu. v tomto pripade alokujem len 2GB pamate.

cize 2GB mi system neda, teda vrati NULL, ale 20GB da, nevrati NULL a
potom padne. zo skusenosti viem (msvc2008ee), ze maximum ktore
mozem alokovat je do 2GB, presnejsie nieco okolo 1.6GB ~ 1.7GB, a
kedze ziadam pamat do tohto rozsahu system mi vracia NULL a mozem
sa podla toho zariadit.

napr. v jednom programe mam pole ukazovatelov na bloky pamate. podla
potreby doalokujem dalsi blok ak mam v bloku pamate malo. takto mozem
ist az po tych 1.6GB, ak dosiahnem tu hranicu a ziadam dalsi blok uz mi
ho system neda, vrati NULL z malloc() a tym padom ukoncujem program
korektne bez padu.

nikdy som neskusal alokovat nasobky RAM, ale presne ako pise nou pri
velkych objednavkach uz malloc() nevracia NULL a teda nieje ako testovat
navratovu hodnotu.

P.S. nefiem ci som to napisal zrozumitelne, musim zlepsit svoj prejav
lebo uz si ani sam nerozumiem...
_________________
hadam to OpenGL este par rokov prezije
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Ladis



Založen: 18. 09. 2007
Příspěvky: 1484
Bydliště: u Prahy

PříspěvekZaslal: 13. červenec 2012, 09:20:57    Předmět: Odpovědět s citátem

Nejsou ty 2 GB omezení 32bit Windows?
_________________
Award-winning game developer
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
manutara



Založen: 02. 01. 2012
Příspěvky: 81
Bydliště: Kosice SVK

PříspěvekZaslal: 13. červenec 2012, 09:29:10    Předmět: 2GB Odpovědět s citátem

citace:
Nejsou ty 2 GB omezení 32bit Windows?


jj, ale aj na 64bit stroji kompilovane pomocou msvc2008ee existuje toto
obmedzenie, moj pripad. neviem ako to je s msvc2010ee, ten je nepekne
modry tak sa mi v nom nechce robit. msvc.. pro taketo obmedzenia nemaju,
ale zase, kto mi to kupi, hehe...

na druhej strane, potreba viac ako povedzme 2GB pamate, ciste len RAM je
podla mojho nazoru dost zriedkava...
_________________
hadam to OpenGL este par rokov prezije
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
rezna



Založen: 27. 07. 2007
Příspěvky: 2150

PříspěvekZaslal: 13. červenec 2012, 11:16:32    Předmět: Odpovědět s citátem

omezeni 32bit programu - nikoliv windows je dano 2GB pameti, kterou lze alokovat

toto omezeni lze obejit pouzitim prepinace (kompileru a nasledne v PE hlavicce) LARGE_ADDRESS_AWARE

ta umozni naalokovat az 4GB na proces (32bitovy) - tim ze povoli vyuziti i posledniho bitu adresy - ten je standardne zakazan, neb spousta programu ho vyuzivala k jinym cachrum a prave prepinacem LARGE_ADDRESS_AWARE davate najevo, ze vite, ze pointery nemrsite

u 32bit windows potom toto omezeni neni 4GB, ale je dano prepinacem /3G v boot.ini (plati pro XP) pripadne jinak (vista, 7 - stale 32bit)

u 64bit systemu jsou to proste 4GB - vic stejne nelze ve 32bit adresovem prostoru aplikace adresovat
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
manutara



Založen: 02. 01. 2012
Příspěvky: 81
Bydliště: Kosice SVK

PříspěvekZaslal: 13. červenec 2012, 11:20:24    Předmět: obmedzenie Odpovědět s citátem

-> rezna

vdaka opat som o nieco mudrejsi, mozno sa to niekedy v buducnnosti
bude hodit
_________________
hadam to OpenGL este par rokov prezije
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Zobrazit příspěvky z předchozích:   
odeslat nové téma   Odpovědět na téma    Obsah fóra České-Hry.cz -> C / C++ Časy uváděny v GMT + 1 hodina
Jdi na stránku Předchozí  1, 2, 3  Další
Strana 2 z 3

 
Přejdi na:  
Nemůžete odesílat nové téma do tohoto fóra
Nemůžete odpovídat na témata v tomto fóru
Nemůžete upravovat své příspěvky v tomto fóru
Nemůžete mazat své příspěvky v tomto fóru
Nemůžete hlasovat v tomto fóru


Powered by phpBB © 2001, 2005 phpBB Group


Vzhled udelal powermac
Styl "vykraden" z phpBB stylu MonkiDream - upraveno by rezna