Registrace nového uživatele     Návod     Kluby     Archív  Lopuchu     Lopuch.cz  

Zelený je lopuch,
fotbal to je hra...

Lopuch.cz

Jméno:
Heslo:
Podpora LCD:
 
Klub C, C++ [ŽP: neomezená] (kategorie Programování) moderuje Šéf Lopuchu.
Archiv

Články

Jak bezpečně ukončit vlákno z DllMain
FastAllocPool - urychlení častých alokací a dealokací
Akce a zpráva jako objekt
Tuply v C++
Efektivní alokátor malých objektů a tady druhý a třetí díl
Šablony: Být vládce kvalifikátorů
Vracíme z funkce objekty
Základy komunikace mezi procesy (ve Windows)
Multiple Interface a Instance Factory
Multithreading v C++ (ve Win32)
  Nastavení klubu     Nastavení práv     Homepage     Anketa     Přítomní     Oblíbené     Lopuch     Kategorie  
autor: 
text: 
vyplnit a 
Help
 Titulek, text příspěvku  
Opište pozpátku následující text bez prostředního znaku: knnlgip
[ 380 ] <Novější  <<<Nejnovější  Nejstarší>>>  Starší>  
huh huh 26.3.2009 01:18  744
Davpe [743]: To je jednoduchý, newA ve funkci add se alokuje na zásobníku, po ukončení této funkce se tato pamět na zásobník vrátí a někdy během prvního volání printf se znovu použije.

Řešení: pamět alokovat v haldě:
void add (A **array) {
A* newA = malloc(sizeof(A));
newA->structB.value = 12345;
array[1] = newA;
}


BTW add(&*pointers); je úplně to samý jako add(pointers);
davpe Davpe 26.3.2009 00:45  743
Potreboval bych pomoctmam tento kod

#include "stdio.h"
#include "stdlib.h"

struct b {
int value;
};

struct a {
struct b structB;
};

typedef struct a A;

void add (A **array) {
A newA;
newA.structB.value = 12345;
array[1] = &newA;
}

A *pointers[5];

int main (void) {
add (&*pointers);

printf("%d\n", pointers[1]->structB.value); // Vypise 12345 -> spravne
printf("%d\n", pointers[1]->structB.value); // Vypise nesmysl (pravdepodobne adresu v pameti), proc?
getchar();

return 0;
}


predem dekuji za odpoved. klidne po mne rvete, hlavne mi reknete co delam blbe
bredy 4.2.2009 00:24  742
Tohle by mohlo někoho zajímatJak dostat řetězec do parametru šablony
bredy 30.1.2009 14:53  741
Popis rozhraní GC v C++
huh huh 27.1.2009 13:03  740
BTW, výborná kniha Pasti a propasti jazyka C++ jen za 87 Kč.
Zlevněno toho maj samozřejmě víc (Symbian atd...).
bredy 30.12.2008 23:32  739
Další pokus o Garbage Collector v C++
ago 4.11.2008 21:23  738
moc moc dakujem
bredy 4.11.2008 20:30  737
(slovenský překlad) :-D
bredy 4.11.2008 20:28  736
AGONo v Céčku můžeš použít normálně fopen(). Funkce akorát musí tento soubor buď vrátit nebo předat nějak jinak.

Soubor se deklaruje jako:
FILE *soubor;


Pokud ho chceš z funkce vracet.
FILE *otevriSoubor( ... ) {
  ...
  ...
  FILE *soubor = fopen(...);
  ...
  return soubor;
}

Pak soubor někdy zavřeš
fclose(f);

Více zde (český překlad)

ago 4.11.2008 19:51  735
Ahojte. Potrebujem (v Cecku)otvorit subor vo funkcii, ale tak aby zostal otvoreny aj po jej ukonceni. Proste aby s tym suborom mohli pracovat aj ine funkcie az kym ho nejakou inou funkciou nezatvorim. Mozno pre niekoho lahka otazka, no ja si akosi neviem dat rady :( Dakujem.
decide 23.9.2008 14:34  734
machAno, přesněji, nesaháš na GUI ze dvou vláken?
bredy 23.9.2008 10:50  733
založil jsem seriál o serializaci, kde jsou všechny články hezky překledně pod sebou. koho téma zajíma, necht zkusí následující link.

serializace objektů
mach 22.9.2008 14:57  732
Bredy: Diky. Prozkoumal jsem ruzny debugovaci nastroje a nakonec se dostal k tomu, ze sem to zkompiloval pod Linuxem a gdb/valgrindem (ktery jestli to dobre chapu kontroluje ty "narazniky", pokud je tam teda gcccko s parametrem -g da) nasel leakovani pameti :-)
bredy 19.9.2008 01:03  731
Při sledování paměti možná pomůže tohle Magic debug values
bredy 19.9.2008 00:56  730
Tohle se mi často dělo u objektů s počítanou referencí. Jedno vlákno snížilo referenci a druhé z výšilo. Občas se to ale trefilo mezi, že ti pak byl schopen vyjít výpočet tak že 1 + 1 = 1 (protože druhé vlákno z toho udělalo 0 a 0 + 1 = 1. Pak došlo k tomu, že jedno vlákno uvolnilo paměť (čítač referencí klesl na nulu) a to druhé tam následně zapsalo jedničku. Člověče, dost mě šokovalo, jak často mi to takhle spadlo.

Jinak tahle chyba se detekuje tak, že v debug verzi je paměť vyplněná známou hodnotou. Hodně pak pomůže prozkoumat obsah změnené paměti, zda změna neodpovídá něčemu. Například já na to přišel tak, že jedno 32-bit slovo tam bylo inkrementováno (mám pocit, že se to vyplñuje CDCDCDCD a já tam viděl CECDCDCDCD, takže to bylo jasné). A pozor na to, že chyba se může objevit až za hodně dlouho. Doporučuju logovat alokace a při vzniku chyby si projít log a najít tu alokaci, která paměť alokovala a dealokovala.

Pokud používáš nějaké chytré pointery, tak čítače referencí by měly být měněny přinejmenším funkcí InterlockedIncrement / Decrement, namísto obyčejné ++

Jo, aspektem téhle chyby je, že vzniká náhodně. Pokud ti vzniká pravidelně, tak tam někde skutečně zapisuješ do dealokované paměti. Ale to by mělo jít debugerem snadno zjistit.

[ 380 ] <Novější  <<<Nejnovější  Nejstarší>>>  Starší>  

(c) 2001-2011 Lopuch.cz   
Kontakt