Zobrazit předchozí téma :: Zobrazit následující téma |
Autor |
Zpráva |
Aroidzap

Založen: 14. 11. 2011 Příspěvky: 68
|
Zaslal: 12. červenec 2012, 18:11:56 Předmět: |
|
|
citace: |
alokoval jsem pro ty char* o jeden char min nez jsem zapisoval |
resenim byla alokace o 1 char vic
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 
Naposledy upravil Aroidzap dne 12. červenec 2012, 18:17:34, celkově upraveno 1 krát |
|
Návrat nahoru |
|
 |
manutara

Založen: 02. 01. 2012 Příspěvky: 81 Bydliště: Kosice SVK
|
Zaslal: 12. červenec 2012, 18:16:22 Předmět: |
|
|
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 |
|
 |
if.then
Založen: 13. 04. 2008 Příspěvky: 579
|
Zaslal: 12. červenec 2012, 18:17:27 Předmět: |
|
|
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 |
|
 |
Aroidzap

Založen: 14. 11. 2011 Příspěvky: 68
|
Zaslal: 12. červenec 2012, 18:19:23 Předmět: |
|
|
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 |
|
 |
rezna
Založen: 27. 07. 2007 Příspěvky: 2156
|
Zaslal: 12. červenec 2012, 18:19:28 Předmět: |
|
|
@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 |
|
 |
Aroidzap

Založen: 14. 11. 2011 Příspěvky: 68
|
Zaslal: 12. červenec 2012, 18:23:17 Předmět: |
|
|
no dobre, tak se omlouvam, jen jsem zadal o pomoc... |
|
Návrat nahoru |
|
 |
rezna
Založen: 27. 07. 2007 Příspěvky: 2156
|
Zaslal: 12. červenec 2012, 18:36:49 Předmět: |
|
|
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 |
|
 |
manutara

Založen: 02. 01. 2012 Příspěvky: 81 Bydliště: Kosice SVK
|
Zaslal: 13. červenec 2012, 06:01:33 Předmět: troska kodu, alokace dealokace |
|
|
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 |
|
 |
rezna
Založen: 27. 07. 2007 Příspěvky: 2156
|
Zaslal: 13. červenec 2012, 06:39:44 Předmět: |
|
|
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 |
|
 |
nou

Založen: 28. 07. 2007 Příspěvky: 1051
|
Zaslal: 13. červenec 2012, 07:06:58 Předmět: |
|
|
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 |
|
 |
manutara

Založen: 02. 01. 2012 Příspěvky: 81 Bydliště: Kosice SVK
|
Zaslal: 13. červenec 2012, 07:44:21 Předmět: NULL |
|
|
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 |
|
 |
Ladis

Založen: 18. 09. 2007 Příspěvky: 1537 Bydliště: u Prahy
|
Zaslal: 13. červenec 2012, 09:20:57 Předmět: |
|
|
Nejsou ty 2 GB omezení 32bit Windows? _________________ Award-winning game developer |
|
Návrat nahoru |
|
 |
manutara

Založen: 02. 01. 2012 Příspěvky: 81 Bydliště: Kosice SVK
|
Zaslal: 13. červenec 2012, 09:29:10 Předmět: 2GB |
|
|
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 |
|
 |
rezna
Založen: 27. 07. 2007 Příspěvky: 2156
|
Zaslal: 13. červenec 2012, 11:16:32 Předmět: |
|
|
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 |
|
 |
manutara

Založen: 02. 01. 2012 Příspěvky: 81 Bydliště: Kosice SVK
|
Zaslal: 13. červenec 2012, 11:20:24 Předmět: obmedzenie |
|
|
-> 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 |
|
 |
|