[ flx @ 12.06.2005. 12:35 ] @
Dakle na kraju izvrsenja programa izbacuje sledecu poruku:


Debug Assertion Failed!

Program: ...
File:dbgdel.cpp
Line:52

Expression:_BLOCK_TYPE_IS_VALID(p_Head->nBlockUse)


Da li neko zna uopste o cemu je otprilike rec ako izadje ovakva poruka.

Hvala.
[ itf @ 13.06.2005. 13:07 ] @
Rijec je zasigurno o dinamickoj dealokaciji memorije. Meni se to zato par puta dogodilo. Provjeri da li si sve ispravno dealocirao i provjerio da li su i alokacije uspjele.
[ z@re @ 16.06.2005. 01:58 ] @
ajd postaj sve dijelove koda gdje inicializiras pointere, i sve djelove koda gdje ih oslobadjas.
[ yooyo @ 16.06.2005. 10:01 ] @
z@re, z@re... pa ti imas memory leak u potpisu:

Code:

#include <stdio.h>
#include <string.h>

void main()
{
 char *potpis;
 potpis = (char *)malloc(12);

 strcpy(potpis, "nema_potpisa");
 potpis[12] = '\0';

 printf("%s\n", potpis);
}


yooyo
[ flx @ 16.06.2005. 23:21 ] @
Program je dosta velik ali evo jedna cinjenica:

kada napisem npr:

Objekat ob;

i sada ga prosledim dalje u neki drugi objekat on izbaci tu gresku sa pocetka,ali ako napisem:

Objekat *ob=new Objekat;

i prosledim, greske na kraju nema.


[ overc @ 23.06.2005. 21:20 ] @
void main()
{
char *potpis; //ok
potpis = (char *)malloc(12);//ok moglo i bolje "(char *)malloc(12 * sizeof(char))"

strcpy(potpis, "nema_potpisa");//ok ! zauzima 12 byte-a(12 * sizeof(char))
potpis[12] = '\0';// ! hm prepisao si memorjiu koja nije tvoja jer
//kako si naveo: malloc(12) zauzeo si samo 12 bayta znaci da mozes
//dereferencirat samo od potpis[0] do potpis[11] jer indexi idu od 0 do
//n-1 zanci od 0 do 11; (neki puta moze proc a neki puta ti javi error
//ovisi kaj se nalazi na tom delu u memorii)
printf("%s\n", potpis);
free(potpis);// naravno ovo moze i ne mora jer sam OS(ovisi koji ) ti sam automatski
//oslobodi memoriu koju si zauzeo..
}
[ Marko Stankovic @ 23.06.2005. 23:40 ] @
Citat:
flx: Program je dosta velik ali evo jedna cinjenica:

kada napisem npr:

Objekat ob;

i sada ga prosledim dalje u neki drugi objekat on izbaci tu gresku sa pocetka,ali ako napisem:

Objekat *ob=new Objekat;

i prosledim, greske na kraju nema.


Pazi ne znam kakav je kod i sta ocekuju te metode kojima prosledjujes objekat, ali postoji veeeeelika razlika izmedju prosledjivanja pokazivaca i prosledjivanja celog objekta. Ako metoda ocekuje pokazivac, prosledi joj pokazivac ili adresu objekta, a nikako ceo objekat.

Ako je kod veliki ne moras da ostavljas ceo kod, vec ostavi tu 52. liniju koja pravi problem, i ostavi deklaraciju metode ako se slucajno poziva neka na toj liniji.


Citat:
overc:
free(potpis);// naravno ovo moze i ne mora jer sam OS(ovisi koji ) ti sam automatski
//oslobodi memoriu koju si zauzeo..
}


Uh, ne mora???? Mozda u ovom banalnom primeru i ne mora ali kad god rezervises memoriju moras je obavezno i osloboditi kada vise nije potrebna.
[ overc @ 24.06.2005. 10:39 ] @
da naravno zaboravih reci da kada alociras memoriju sa malloc provjeri kaj je vratila :

potpis = (char *)malloc(12);

provjera:

if(potpis==NULL) ....ispisi nesto..


jer ako malloc nije mogao zauzeti nista...

strcpy(potpis, "nema_potpisa"); // tu ce ti nastat s*****


to naravno "ne moras" kada zauzimas samo 12 byte-a jer ce malloc proc


Marko Stankovic wrote:

Citat:
Uh, ne mora???? Mozda u ovom banalnom primeru i ne mora ali kad god rezervises memoriju moras je obavezno i osloboditi kada vise nije potrebna
.


u ovom primjeru ne mora (jer je premali) i pisao on free ili ne pisao memorija ce se osloboditi(prilikom izlaska) ,naravno da u vecim primjerima bi uvjek malloc() trebao ici u paru sa free()...

[ yooyo @ 25.06.2005. 10:26 ] @
Citat:
u ovom primjeru ne mora (jer je premali) i pisao on free ili ne pisao memorija ce se osloboditi(prilikom izlaska)...


Zavisi od OS-a... Windows, Linux, MacOS ili neki veci OS ce osloboditi memoriju, ali ako pises programe za male uredjaje (mikrokontrolere, telefone, ..) mozda i nece.

yooyo

[ Mihajlo Cvetanović @ 25.06.2005. 15:56 ] @
Citat:
Code:

 strcpy(potpis, "nema_potpisa");


Ovde se kopira 13 bajtova, 12 + '\0'.
[ Marko Stankovic @ 25.06.2005. 22:34 ] @
Citat:
overc:
u ovom primjeru ne mora (jer je premali) i pisao on free ili ne pisao memorija ce se osloboditi(prilikom izlaska) ,naravno da u vecim primjerima bi uvjek malloc() trebao ici u paru sa free()...


Ok, rekao sam da je primer prost i da nece biti problema, ali iskreno mislim da nikada ne treba razmisljati da li je kod prost ili nije vec uvek treba koristiti free() pa makar rezervises i jedan bajt, jer ko zna mozda ce nekad pozeleti da malo izmeni kod pa pusti neku beskonacnu petlju a zaboravi da nije ubacivao free() i posle x sekundi program zauzeo celu memoriju.