[ Goran Arandjelovic @ 15.12.2005. 11:33 ] @
| Code:
#include <iostream>
using namespace std;
int main(int argc, char *argv[])
{
char buf[8];
int *x = new(&buf[0])int;
int *y = new(&buf[0]+4)int;
delete x;
delete y;
}
Dakle, da li se problem pri brisanju x odnosno y promenljive javlja zato što bafer buf nije na heap-u? Jer ako bude, onda nema problema... |
[ Dragi Tata @ 15.12.2005. 13:05 ] @
Upravo tako. Placement new uopšte ne rezerviše memoriju, već samo konstruiše objekat u memoriji koju si mu ti naznačio. Tako da u tvom slučaju pokušavaš delete na memoriju sa steka. Da si buf kreirao na heapu, trebao bi ti samo jedan delete buf, a ne delete x i y
[ Goran Arandjelovic @ 15.12.2005. 15:43 ] @
Jasno..Hvala.
A kada se sve obično koristi placement new?
Neko bi prvo rezervisao memoriju nekim baferom sigurnosti radi, a zatim postavio neki drugi objekat na to mesto. Međutim, postoji mogućnost da je nemoguće rezervisati ni memoriju za bafer. Zašto onda koristiti taj način, ako bi smo već mogli direktno da rezervišemo memoriju za dati objekat gde bi smo eventualno uhvatili izuzetak ako je tako nešto nemoguće učiniti u tom trenutku?
Fina stvar je što se objekti mogu poređati u određenom redosledu, tačno jedan za drugim kao kada bi se deklarisao niz istih objekata na steku npr. S tim što to može biti opasno, jer se nešto može u memoriji pregaziti na taj način...
Možeš li da navedeš neki primer gde je neki problem elegantno rešen sa placement new?
[ tosa @ 15.12.2005. 16:03 ] @
Mozes da "menadzerises" memoriju time, i da smanjis fragmentaciju memorije.
Samo oprez, neki kompajleri (tacnije jedan koji sam video) su skloni da
setuju to parce memorije na nulu ukoliko je u pitanju kompajler-generisani default
konstruktor. To moze da ti stvori problem ukoliko si vec inicijalizovao parce memorije
i onda zelis da tu "smestis" objekat.
[ Dragi Tata @ 15.12.2005. 18:38 ] @
Druga interesantna primena placement operatora je kad imaš neki hardverski uređaj koji ima mapiranu memoriju na neki opseg i ti onda želiš da kreiraš objekte tačno na tom opsegu.
Copyright (C) 2001-2025 by www.elitesecurity.org. All rights reserved.