Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

Kako utvrditi da li dati pokazivac pokazuje na dinamicki alocirani objekat.

[es] :: Art of Programming :: Kako utvrditi da li dati pokazivac pokazuje na dinamicki alocirani objekat.

[ Pregleda: 1781 | Odgovora: 13 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

Nedeljko
Nedeljko Stefanović
Beograd

Član broj: 314
Poruke: 5628
*.dynamic.sbb.rs.



Profil

icon Kako utvrditi da li dati pokazivac pokazuje na dinamicki alocirani objekat.04.06.2008. u 08:31

Napisati funkciju bool dynamic(void*) takvu da,

1. Ako je p pokazivac na objekat dinamicki alociran, onda je dynamic(p)=true.
2. Ako je x staticka promenljiva ili promenljiva na steku, onda je dynamic(&x)=false.

Ja sam napisao sledecu funkciju:

Code:

bool dynamic(void *p) {
    char x;

    return p < &x;
}


Zasnovana je na pretpostavkama da:

1. Stek raste na dole.
2. Dinamicki alocirani objekti su na adresama ispod steka.

Valjda to garantuje POSIX standard, mada nisam siguran. Problem sa ovim resenjem je sto za pokazivac na staticku promenljivu vraca true umesto false.
Pishi kao shto govorish, a chitaj kao shto je napisano.
04.06.2008. u 08:31 

EArthquake
Aleksandar Nikolic
Novi Sad

Član broj: 20684
Poruke: 857
*.eunet.rs.

Sajt: www.phearless.org


Profil

icon Re: Kako utvrditi da li dati pokazivac pokazuje na dinamicki alocirani objekat.04.06.2008. u 17:21
pa u sustini trebalo bi da je tako ,

dinamicki alocirani delovi memorije su na heap-u , na linuxu je to oko 0x0804xxxx adresa


tako da bi to trebalo da radi
www.phearless.org
No light, but rather darkness visible
04.06.2008. u 17:21 

Nedeljko
Nedeljko Stefanović
Beograd

Član broj: 314
Poruke: 5628
*.dynamic.sbb.rs.



Profil

icon Re: Kako utvrditi da li dati pokazivac pokazuje na dinamicki alocirani objekat.05.06.2008. u 11:15
Laptopovi

Rekoh, ovo resenje ne radi korektno sa statickim promenljivama.
Code:

#include <iostream>

using namespace std;

bool dynamic(void *p) {
    char x;

    return p < &x;
}

int main()
{
    static int x = 0;

    if (dynamic(&x))
        cout << "Promenljiva je dinamicka" << endl;
    else
        cout << "Promenljiva nije dinamicka" << endl;
}



Ovaj program ispisuje poruku "Promenljiva je dinamicka", sto je netacan rezultat.
Pishi kao shto govorish, a chitaj kao shto je napisano.
05.06.2008. u 11:15 

EArthquake
Aleksandar Nikolic
Novi Sad

Član broj: 20684
Poruke: 857
*.eunet.rs.

Sajt: www.phearless.org


Profil

icon Re: Kako utvrditi da li dati pokazivac pokazuje na dinamicki alocirani objekat.05.06.2008. u 17:44
e svasta , nisam ni video taj deo

naravno da ce biti tako , nisam se setio toga

pa , mozes da pogledas gde ti se krecu segmenti , u kojim adresama

posto ce dinamicke biti iskljucivo na heap-u , ostale u .bss , .data i sl , svaki od segmenata
ima odredjen raspon adresa koji zauzima,

e sad , dok nije bilo randomizaciju u kernelu sto se tice steka , biblioteka i sl

to si mogao da hardcodujes , tj adrese su bile stalne ,

sad bi verovatno morao da ih utvrdis po pokretanju programa ,

sto sumnjam da bi bilo tesko

da li se to pitanje odnosi iskljucivo za linux ili bi trebalo da radi univerzalno ?

pozdrav ,
Aca





[Ovu poruku je menjao EArthquake dana 05.06.2008. u 18:59 GMT+1]
www.phearless.org
No light, but rather darkness visible
05.06.2008. u 17:44 

Dragi Tata
Malo ispod Kanade

Član broj: 1958
Poruke: 3906
*.microsoft.com.



Profil

icon Re: Kako utvrditi da li dati pokazivac pokazuje na dinamicki alocirani objekat.05.06.2008. u 18:08
Ukratko, ne može - bar ne na portabilan način.
05.06.2008. u 18:08 

EArthquake
Aleksandar Nikolic
Novi Sad

Član broj: 20684
Poruke: 857
*.eunet.rs.

Sajt: www.phearless.org


Profil

icon Re: Kako utvrditi da li dati pokazivac pokazuje na dinamicki alocirani objekat.05.06.2008. u 22:10
bas me bacilo u razmisljanje , ali izgleda da osim da , recimo , citas /proc/PID/maps pa da uporedjujes adrese segmenata
ne vidim drugo resenje

a to definitivno nije portabilno

na windowsu nemam pojma kako bi moglo
www.phearless.org
No light, but rather darkness visible
05.06.2008. u 22:10 

Nedeljko
Nedeljko Stefanović
Beograd

Član broj: 314
Poruke: 5628
*.dynamic.sbb.rs.



Profil

icon Re: Kako utvrditi da li dati pokazivac pokazuje na dinamicki alocirani objekat.06.06.2008. u 13:51
Pa, treba da radi minimum na Linux i Windows platformama. Da li mogu da pretpostavim da su staticke promenljive na adresama ispod heap-a, a lokalne iznad heap-a?
Pishi kao shto govorish, a chitaj kao shto je napisano.
06.06.2008. u 13:51 

jablan

Član broj: 8286
Poruke: 3622
*.dynamic.sbb.rs.

Sajt: deca.1000zasto.com


Profil

icon Re: Kako utvrditi da li dati pokazivac pokazuje na dinamicki alocirani objekat.06.06.2008. u 16:00
A za šta se ovo koristi?
I have no country to fight for; my country is the earth; I am a citizen of the world.
06.06.2008. u 16:00 

masetrt
Marko Djurovic
Programer, Omni-Explorer
Beograd

Član broj: 3129
Poruke: 225
*.dynamic.sbb.rs.

Sajt: www.vast.com


Profil

icon Re: Kako utvrditi da li dati pokazivac pokazuje na dinamicki alocirani objekat.06.06.2008. u 19:48
Citat:
A za šta se ovo koristi?


Pravo pitanje je "Cemu ovo sluzi?". E onda neko moze da kaze "A uz to i ne radi". Ova ideja koju Nedeljko koristi je nekada davno i mogla da prodje, ali danas zaboravite na to.
His majesty Grand Duke of Shumadija and Western Pomoravlje
06.06.2008. u 19:48 

Nedeljko
Nedeljko Stefanović
Beograd

Član broj: 314
Poruke: 5628
195.222.97.*



Profil

icon Re: Kako utvrditi da li dati pokazivac pokazuje na dinamicki alocirani objekat.07.06.2008. u 20:47
Imam klasu koja treba u sebi da sadrži pokazivač na istream tako da iz nje čitam znakove, ali ne baš onako kako idu iz ulaznog toka, nego malo obrađene. Rado bih predao klasi pokazivač na tok i prepustio joj odgovornost za uništavanje objekta (da ja ne razmišljam o delete), ali šta ako joj poturim referencu na cin (standardni ulaz) ili neki drugi tok koji nije na heap-u? Destruktor klase mora da "zna" da ne sme da ga. No, rešio sam problem na drugi način.

Klasa ima bool polje destroyInput koje namešta konstruktor. Podrazumevani konstruktor namešta input na &cin i destroyInput na false. Konstruktor koji prihvata string fileName radi input = new ifstream(fileName.c_str()); destroyInput = true; a konstruktor koji prihvata referenci na istream usmerava input na njegovu adresu i stavlja destroyInput na false. Konstruktor kopije je privatan.
Pishi kao shto govorish, a chitaj kao shto je napisano.
07.06.2008. u 20:47 

mmix
Miljan Mitrović
Software Architect
Pančevo, Srbija

SuperModerator
Član broj: 17944
Poruke: 4196
195.252.78.*

Sajt: blog.mitrovic.rs


Profil

icon Re: Kako utvrditi da li dati pokazivac pokazuje na dinamicki alocirani objekat.07.06.2008. u 21:11
Hmm, to mi deluje kao veoma los koncept, objekti i svi ostale heap strukture treba da budu unistavani u kontekstu u kom su kreirani. Sta ako ti objekat kojem si dao stream baci exception pre nego sto uradi delete? Kontekst koji je kreirao stream smatra da je problem resen a objekat ostade na heap-u, eto memory leak-a.
▪ When the only tool you know how to use is a hammer every problem begins to look like a nail
▪ "Gladni stolećima, kupujemo više hleba nego što nam je potrebno. A, onda ga bacamo. Hleb u đubretu nije dobar prizor. On sluti na zlo. I zlo dolazi" - Momo Kapor
▪ "Opportunity is missed by most because it is dressed in overalls and looks like work" - Thomas Edison
07.06.2008. u 21:11 

Nedeljko
Nedeljko Stefanović
Beograd

Član broj: 314
Poruke: 5628
195.222.97.*



Profil

icon Re: Kako utvrditi da li dati pokazivac pokazuje na dinamicki alocirani objekat.08.06.2008. u 17:12
Citat:
mmix: Hmm, to mi deluje kao veoma los koncept, objekti i svi ostale heap strukture treba da budu unistavani u kontekstu u kom su kreirani.


Pa upravo se to i postize.

1. Ako predajem kreirani tok klasi, klasa nije odgovorna za unistavanje toka.
2. Ako tok treba da bude fajl, konstruktoru se predaje samo ime fajla, klasa kreira tok i unistava ga.
3. Ako je primenjen podrazumevani konstruktor, onda se koristi standardni ulaz cin i klasa nece pokusati da ga unistava.
Pishi kao shto govorish, a chitaj kao shto je napisano.
08.06.2008. u 17:12 

mmix
Miljan Mitrović
Software Architect
Pančevo, Srbija

SuperModerator
Član broj: 17944
Poruke: 4196
195.252.78.*

Sajt: blog.mitrovic.rs


Profil

icon Re: Kako utvrditi da li dati pokazivac pokazuje na dinamicki alocirani objekat.08.06.2008. u 17:54
Moj komentar je bio na tvoj prvobitni plan da selektivno unistavas stream koji ti je prosledjen unutar klase.
▪ When the only tool you know how to use is a hammer every problem begins to look like a nail
▪ "Gladni stolećima, kupujemo više hleba nego što nam je potrebno. A, onda ga bacamo. Hleb u đubretu nije dobar prizor. On sluti na zlo. I zlo dolazi" - Momo Kapor
▪ "Opportunity is missed by most because it is dressed in overalls and looks like work" - Thomas Edison
08.06.2008. u 17:54 

Nedeljko
Nedeljko Stefanović
Beograd

Član broj: 314
Poruke: 5628
*.dynamic.sbb.rs.



Profil

icon Re: Kako utvrditi da li dati pokazivac pokazuje na dinamicki alocirani objekat.09.06.2008. u 08:10
Pa, i tada sam hteo da sve što ja kreiram bude na heap-u, a ostalo ionako nije na njemu.
Pishi kao shto govorish, a chitaj kao shto je napisano.
09.06.2008. u 08:10 

[es] :: Art of Programming :: Kako utvrditi da li dati pokazivac pokazuje na dinamicki alocirani objekat.

[ Pregleda: 1781 | Odgovora: 13 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.