Std::queue - přetížit destruktor? – C / C++ – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu
Reklama
Reklama

Std::queue - přetížit destruktor? – C / C++ – Fórum – Programujte.comStd::queue - přetížit destruktor? – C / C++ – Fórum – Programujte.com

 

Hledá se programátor! Plat 1 800 € + bonusy (firma Boxmol.com)
hlucheucho+10
Posthunter
29. 10. 2014   #1
-
0
-

Ahoj,

mám frontu ukazatelů a potřebuji aby fronta ve svém destruktoru  uvolnila paměť na kterou ukazatelé v ní obsažení ukazují. Mohu přetížit destruktor std::queue? Jak?

Druhá možnost je zavřít frontu do nějaké třídy, kde se destruktor třídy o vše postará.

hu

Nahlásit jako SPAM
IP: 2001:67c:1222:800:91ec:d6...–
Reklama
Reklama
KIIV+42
God of flame
29. 10. 2014   #2
-
0
-

muzes to obalit vlastni tridou ci to podedit...

pak treba unique_ptr by asi nebyl uplne idealni (nesmi se kopirovat a kdyz se udela pop, tak to zavola destruktor - takze pokud bys potreboval dal pracovat s tim pointerem, uz by bylo pozde)

Nahlásit jako SPAM
IP: 94.113.95.–
Program vždy dělá to co naprogramujete, ne to co chcete...
KIIV+42
God of flame
Nahlásit jako SPAM
IP: 94.113.95.–
Program vždy dělá to co naprogramujete, ne to co chcete...
hlucheucho+10
Posthunter
29. 10. 2014   #4
-
0
-

zkouším to s děděním 

typedef struct  {
  char odesilatel[5];
  int timeout;
  int delka;
  char *data;
} RSdata;

//vytvori potomka fronty ukazatelu na strukturu
class fronta : public std::queue<RSdata*>
{

public:
  //potomek bude mit jiny destruktor
  ~fronta();

};

a implementace 

fronta::~fronta()
{
  while (!empty()) {   //uvolni objekty ve fronte
    free(back()->data);
    free(back());       
    pop();
  }
}

očekávané chování: fronta před svým zánikem projde všechny struktury a pro každou strukturu uvolní paměť na kterou ukazuje data. Pak uvolni strukturu a odstraní ukazatel z fronty. Vše provádí dokud není fronta prázdná. Pak fronta zanikne.

Jen si nejsem jistý, zda jsem to implentoval správně. Vůbec mi není jasný, jak je to s voláním destruktoru předka - zda k němu dojde automaticky nebo jestli je to moje starost.

hu

Nahlásit jako SPAM
IP: 2001:67c:1222:800:91ec:d6...–
KIIV+42
God of flame
29. 10. 2014   #5
-
0
-

vola se automaticky po dokonceni toho ve zdedenem objektu

krom toho struktura je taky objekt, tak kdyz k ni udelas destruktor, tak mas o jedno delete mene...

(ale s free to nefunguje - jen new vola konstruktor a delete destruktor)

Nahlásit jako SPAM
IP: 94.113.95.–
Program vždy dělá to co naprogramujete, ne to co chcete...
vitamin+8
Grafoman
29. 10. 2014   #6
-
0
-

#4 hlucheucho
Malo by to fungovat, ale davaj si pozor na null hodnoty:


  while (!empty()) {   //uvolni objekty ve fronte
    assert(back());
    free(back()->data);
    free(back());       
    pop();
  }

Len tak zo zaujimavosti, preco nepouzivas vector?

Nahlásit jako SPAM
IP: 95.105.186.–
obfuscate: "The cruel god Malloc will strike you down. "
ZMeson: "That's the C god. C++ has a new god. "
hlucheucho+10
Posthunter
29. 10. 2014   #7
-
0
-

#6 vitamin
Potřebuji FiFo, proto queue

hu

Nahlásit jako SPAM
IP: 193.86.81.–
vitamin+8
Grafoman
29. 10. 2014   #8
-
0
-

#7 hlucheucho
ok, vies velkost stringu char* data hned pri alokovani struktury RSdata?

Nahlásit jako SPAM
IP: 95.105.186.–
obfuscate: "The cruel god Malloc will strike you down. "
ZMeson: "That's the C god. C++ has a new god. "
hlucheucho+10
Posthunter
29. 10. 2014   #9
-
0
-

velikost stringu je proměnlivá, v době alokace struktury není známá. Předávání ukazatelů má výhodu - omezí se kopírovaní. Sice jsou to malé objekty, ale časté kopírování - 100x nic umořila osla

hu

Nahlásit jako SPAM
IP: 193.86.81.–
vitamin+8
Grafoman
29. 10. 2014   #10
-
0
-

#9 hlucheucho
ak by bola dlzka znama pri alokacii tak by si mohol spojit alokaciu samotnej struktury so stringom a na kopirovanie by ti stacilo memcpy/memmove:


struct RSdata{
	char odesilatel[5];
	int timeout;
	const int delka;
	char *data(){return reinterpret_cast<char*>(this+1);};	///v gcc je mozne pouzit char data[]  alebo  char data[0]
	
	static RSdata* malloc(int len){
		assert(len >= 0);
		RSdata* rsdata = new(::malloc(sizeof(RSdata) + len)) RSdata(len);
		return rsdata;
	}
	
	size_t size_of()const{return sizeof(RSdata)+delka;}
	
	private:
		RSdata(int delka):delka(delka){}
	
};

int main(){
	RSdata* tmp = RSdata::malloc(8);
	///...
	free(tmp);
}
Nahlásit jako SPAM
IP: 95.105.186.–
obfuscate: "The cruel god Malloc will strike you down. "
ZMeson: "That's the C god. C++ has a new god. "
voty+1
Návštěvník
31. 10. 2014   #11
-
0
-

#2 KIIV
Já bych unique_ptr tak nezatracoval. Pokud se použije move při vybírání, tak následný pop neudělá s daty nic. Jen si je potřeba dát pozor na to, že  

auto x = move(queue.front());

"přesune" obsah prvku z fronty do x a prvek ve frontě bude dál neplatný.

Nahlásit jako SPAM
IP: 81.19.38.–
Jednu rozbil a tu druhou ztratil.
KIIV+42
God of flame
31. 10. 2014   #12
-
0
-

#11 voty
jj, jen se to musi hlidat (nebo pouzit metodu release())

a vybirani z fronty se nastesti vzdy dela pomoci front a pop ci podobne..

Nahlásit jako SPAM
IP: 94.113.95.–
Program vždy dělá to co naprogramujete, ne to co chcete...
vitamin+8
Grafoman
31. 10. 2014   #13
-
0
-

hlucheucho v inom vlakne pisal ze pouziva kompilator ktory nepodporuje c++11/14 take mu std::move moc nepomoze :)

Nahlásit jako SPAM
IP: 95.105.186.–
obfuscate: "The cruel god Malloc will strike you down. "
ZMeson: "That's the C god. C++ has a new god. "
hlucheucho+10
Posthunter
6. 11. 2014   #14
-
0
-

Při snaze dotáhnout to dál a vytvořit šablonu jako potomka šablony queue jsem narazil na problém. Potomek šablony třídy je v samostatném cpp souboru a k němu je h soubor s deklaracemi metod (problém popisuje http://www.parashift.com/…vs-decl.html). Vůbec jsem nepochopil použití export (zdroj  http://www.parashift.com/c++-faq/separate-template-fn-defn-from-decl-export-keyword.html). Prosím o malou ukázku kódu pro pochopení věci. Děkuji

Natvrdlé hu :(

Nahlásit jako SPAM
IP: 2001:67c:1222:800:29c9:ca...–
KIIV+42
God of flame
6. 11. 2014   #15
-
0
-

problem je v tom, ze abys mohl sablonu pouzit, musis ji mit k dispozici ... kompilator netusi, jaky instance budes delat. Takze bud si udelas celou sablonu v headeru (klidne ji muzes rozdelit na deklaraci a definici) a to potom includujes, nebo budes mit predkompilovane nejake predpokladane typy... (tusim ze se tomu rikalo nejak jako instantizace - viz tady: http://www.cplusplus.com/forum/articles/14272/) Jinak budes muset holt includovat i cpp soubor..

Nahlásit jako SPAM
IP: 94.113.95.–
Program vždy dělá to co naprogramujete, ne to co chcete...
hlucheucho+10
Posthunter
6. 11. 2014   #16
-
0
-

Vložit cpp měl právě dělat ten export, aspoň tak jsem to pochopil. Že jsem ucho natvrdlé, potřebuji "Idiots Guide"   . Myšlenka implementace v .h souboru možná nebude scestná, ony ty metody jsou jednoduché (původní metody fronty "zabalené" do kritické sekce aby byly thread safe). Ale i tak by nebylo od věci se to pokusit pochopit, určitě to není můj poslední případ použití šablon, navíc příště mohou být vyšší nároky.

hu

Nahlásit jako SPAM
IP: 2001:67c:1222:800:29c9:ca...–
KIIV+42
God of flame
6. 11. 2014   #17
-
0
-

#16 hlucheucho
no v ty ukazce to mas tak, ze kdyz tam das export pro -std=c++11 tak nemusis includovat ten .cpp soubor

a pokud nenadefinujes to makro, tak to proste po deklaraci jeste naincluduje prislusnej cpp soubor s definicema

mozna by bylo jednodussi pouzit preddefinovany makro __cplusplus, kde kdyz bude vetsi jak 201100L, tak mas nejspis i c++11

Nahlásit jako SPAM
IP: 94.113.95.–
Program vždy dělá to co naprogramujete, ne to co chcete...
hlucheucho+10
Posthunter
6. 11. 2014   #18
-
0
-

s tím C++ 11 je trochu problém, u C++ Builderu XE5 jeho podpora u 32 bitů pokulhává. Nakonec jsem to všecko nacpal do hlavičky.

hu

Nahlásit jako SPAM
IP: 2001:67c:1222:800:29c9:ca...–
vitamin+8
Grafoman
6. 11. 2014   #19
-
0
-

#18 hlucheucho
Templaty musia byt v hlavickach (ak ich chces pouzit vo viacerych moduloch). Exportovanie templatov do cpp suboru bolo zo standardu odstranene.

Nahlásit jako SPAM
IP: 95.105.229.–
obfuscate: "The cruel god Malloc will strike you down. "
ZMeson: "That's the C god. C++ has a new god. "
hlucheucho+10
Posthunter
6. 11. 2014   #20
-
0
-

CodeGuard error: Resource leak in process... a podrobnosti objekt vytvořený přes new o velikosti 32 byte nebyl odstraněn, odkazuje na řádek cpp, kde jsem do fronty vložil ukazatel na strukturu. Tato struktura ve frontě zůstala v době zavření aplikace (kvůli testování). Že by ten modifikovaný destruktor nefungoval?

hu

Nahlásit jako SPAM
IP: 2001:67c:1222:800:29c9:ca...–
KIIV+42
God of flame
6. 11. 2014   #21
-
0
-

#20 hlucheucho
co si tam treba dat vypisy, kdy se co zrovna dela?

Nahlásit jako SPAM
IP: 94.113.95.–
Program vždy dělá to co naprogramujete, ne to co chcete...
hlucheucho+10
Posthunter
6. 11. 2014   #22
-
0
-

Dokumentace C++ Builderu stojí za ....  Po zdlouhavém hledání na netu jsem našel kód, který ukazuje, jak provést funkční OnTerminate metodu u TThread objektu.

Teď se CodeGuard pro změnu chová tak, že TThread objekt uvolnil i to, co jsem alokoval pomocí malloc (píše, že destruktor třídy zasahuje do uvolněné paměti). Při ukončení aplikace napíše, že jsem neuvolnil paměť, přitom jsem na ni aplikoval realloc. Vůbec tomu nerozumím   

Vrcholem je snaha nastavit ukazatel na TThread na NULL  podle příkladu http://docwiki.embarcadero.com/…ThreadYield_(C%2B%2B), napíše mi vyjímku. 

hu

Nahlásit jako SPAM
IP: 2001:67c:1222:800:29c9:ca...–
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 91 hostů

Moderátoři diskuze

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032016 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý