Uvolnění paměti – C / C++ – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Uvolnění paměti – C / C++ – Fórum – Programujte.comUvolnění paměti – C / C++ – Fórum – Programujte.com

 

Martin
~ Anonymní uživatel
1602 příspěvků
18. 8. 2015   #1
-
0
-

Zdravím, chtěl bych se zeptat, když alokuji paměť pomocí new s umístěním a následně vytvořím si na bufferu dejme tomu třeba 2 objekty. Moje otázka zní jestli stačí uvolnit paměť  bufferu, kde jsou oba objekty uloženy nebo musím volat explicitně destruktory pro oba objekty a pak pro buffer (tak jak radí v knížce). Děkuji za odpověď

Pro upřesnění:

#include <new>

const int BUF = 512;

int main()

{

  char * buffer = new char [BUF];

Nejaky_objekt *pt1, *pt2;

pt1 = new (buffer) Nejaky_objekt;

pt2 = new (buffer + sizeof (Nejaky_objekt)) Nejaky_objekt);

.........

pt1->~Nejaky_objekt();                       // <----- Je to nutné??

pt2->~Nejaky_objekt();                       // <----- Je to nutné??

delete [] buffer;                                  // <---- Když uvolním pamět, kde jsou oba objekty uloženy

 return 0;

}

Nahlásit jako SPAM
IP: 85.93.187.–
vitamin+8
Grafoman
19. 8. 2015   #2
-
0
-

#1 Martin
Je to nutne delete [] buffer maze pole charov, nevie nic o type objektu a tym padom ani nevola destructor.

Nahlásit jako SPAM
IP: 195.28.77.–
obfuscate: "The cruel god Malloc will strike you down. "
ZMeson: "That's the C god. C++ has a new god. "
KIIV
~ Moderátor
+43
God of flame
19. 8. 2015   #3
-
0
-

Takze k tomu co tu mas: ano explicitni destruktory jsou nutne (u objektu vlastne nikdy nevis, jestli nema zabrane nejake dalsi zdroje ci pamet). Kdyz uvolnis pamet bufferu, tak uz bys k nemu nemel pristupovat, jelikoz ti to uz muze cokoliv dalsiho zmenit pod rukama - proste je to uz neplatna pamet.

Standard c++11 mimochodem prebral specialni objekt std::unique_ptr<typ>, kteremu pri konstrukci predas novy pointer a on se o nej postara, jakmile prestava platit (RAII idiom). Nicmene u tebe to pouzit nejde, protoze placement new veskutecnosti nealokuje novou pamet - musel by sis udelat vlastni objekt, ktery by v destruktoru zavolal jen destruktor drzeneho pointeru. Samozrejme je nesmis vytvorit dynamicky, jinak bys zase musel volat delete explicitne.

Proste tenhle kod je relativne nebezpecny. Vse se to da udelat i lepe. Taky trochu zalezi na tom, o co se snazis.

Nahlásit jako SPAM
IP: 94.113.92.–
Program vždy dělá to co naprogramujete, ne to co chcete...
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, 36 hostů

Moderátoři diskuze

 

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