Builder.cz - Informacni server o programovani

Odběr fotomagazínu

Fotografický magazín "iZIN IDIF" každý týden ve Vašem e-mailu.
Co nového ve světě fotografie!

 

Zadejte Vaši e-mailovou adresu:

Kamarád fotí rád?

Přihlas ho k odběru fotomagazínu!

 

Zadejte e-mailovou adresu kamaráda:



Zase ty pointry .. / "std::bad_alloc at memory"

Seznam témat     Nová odpověď

Přihlásit se     Registrace     Zapomenuté heslo

Re: Zase ty pointry .. / "std::bad_alloc at memory"

Autor: Kra

16:12:46 29.05.2010

Diky moc, ja vedel, ze tam bude nejaka pekna prasarnicka :)

P.S. Shodou okolnosti se jedna o utilitku na parsovani upd logu :) A getline zlobi na znaku "", ktery tam je .. ale to uz si snad poresim. Jeste jednou diky.

Citovat příspěvek

 

Re: Zase ty pointry .. / "std::bad_alloc at memory"

Autor: Farao

14:56:52 29.05.2010

Vidím tam několik problémů:

>> string strSource = (string) (Source);

Nejsem si bez vyzkoušení jistý co tohle přetypování ukazatele na třídu udělá, ale řekl bych že nejspíš problémy.

Správné řešení je

string strSource(Source);

nebo ekvivalentní

string strSource = Source;

>> char *temp = new char; //how to deallocate? :(
>> strcpy (temp,strSource.c_str()); //obsolete but much easier than strcpy_s

To je velký průšvih. Alokuješ paměť pro jeden znak a potom do ní kopíruješ text s proměnlivou délkou. Tj. přepisování paměti jak vyšité. Divím se, že ti to nepadá už v tomhle místě.

Správně je

char *temp = new char[strSource.length()+1]; // +1 je kvůli ukončovací nule
strcpy (temp,strSource.c_str());

A alokovanou paměť musíš potom uvolnit pomocí delete[]. Samozřejmě až v okamžiku, kdy ji už nepotřebuješ, tj. v main

delete[] Output; // Output ukazuje na temp protože si ukazatel vrátíš z funkce GenerateName

Citovat příspěvek

 

Zase ty pointry .. / "std::bad_alloc at memory"

Autor: Kra

11:50:20 29.05.2010

Zdravim,

nedavno jsem se vrhl na c++ a zda se, ze trochu plavu v pointrech. Mam program, ktery mi ve VS crashuje s chybou "std::bad_alloc at memory". Zde je zkraceny kod:

//v main:
char *Output;
Output = GenerateName (argv[1]);
if (!ProcessFiles (argv[1],Output))
....

//jednotlive fce:


char *GenerateName (char *Source)
{
string strSource = (string) (Source);
short sDot = strSource.find_last_of(".");
strSource = strSource.substr (0,sDot);
strSource.append(".txt");
char *temp = new char; //how to deallocate? :(
strcpy (temp,strSource.c_str()); //obsolete but much easier than strcpy_s
return temp;
}

bool ProcessFiles (char *Source, char *Target)
{
fstream LogFile (Source,fstream::in);
....
}

Pokud to krokuju, tak mi to crashne v ProcessFiles prave na vytvareni LogFile. Imho je to ale nahoda, protoze pokud odstranim deklaraci Output/volani Generatename a zavolam ProcessFiles s natvrdo nastavenym stringem, tak vsechno projde jako po masle.

Chyba musi byt ve zpusobu vraceni char* fci GenerateName. Muj cil byl, aby tato fce vracela upraveny retezec (resp. pointr) - coz se zda tak nejak funguje, protoze Output po volani teto fce skutecne odkazuje na spravy retezec. Dokazete nekdo urcit, ktera cast kodu je shnila a pripadne jak to resit?

btw. pokud alokuju pointr "temp" pres new uvnitr GenerateName, mel jsem za to, ze muzu pouzit free na "Output" az uvnitr fce main, abych nemel memory leak. To ale nefunguje (crash) .. mozna to nejak souvisi?

Diky,

Kra

Citovat příspěvek

 

 

 

Přihlášení k mému účtu

Uživatelské jméno:

Heslo: