Kontejner, ukazael a auto_ptr – C / C++ – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu
Reklama
Reklama

Kontejner, ukazael a auto_ptr – C / C++ – Fórum – Programujte.comKontejner, ukazael a auto_ptr – C / C++ – Fórum – Programujte.com

 

Hledá se programátor! Plat 1 800 € + bonusy (firma Boxmol.com)
yaqwsx+9
Posthunter
12. 8. 2008   #1
-
0
-

Mám problém když mám vector auto_ptr:

vector<auto_ptr<objekt> > v;

v.push_back(auto_ptr<objekt>(new objekt));

Kompiler mi hlásí:

d:\program files\microsoft visual studio 9.0\vc\include\vector(1233) : error C2558: class 'std::auto_ptr<_Ty>' : no copy constructor available or copy constructor is declared 'explicit'
1> with
1> [
1> _Ty=objekt
1> ]



Navíc jsem myslím na builderu četl, že není vhodné uchovávat v kontejneru auto_ptr, ale důvod tam nebyl...

Můj dotaz zní: Kde dělám chybu? A jak se běžně řeší uchovávání ukazatelů v kontejneru?

Nahlásit jako SPAM
IP: 85.160.99.–
Life is too short to remove USB mass storage safely...
Správný drsňák udělá z konzole cokoliv
Reklama
Reklama
midin0
Věrný člen
12. 8. 2008   #2
-
0
-

Zde je důvod, proč není auto_ptr vhodný:
The problem is that auto_ptr does not quite meet the requirements of a type you can put into containers, because copies of auto_ptrs are not equivalent. For one thing, there's nothing that says a vector can't just decide to up and make an "extra" internal copy of some object it contains.

Tohle by mohlo pomoct:
http://books.google.cz/books?id=fSk99oy_mKcC&pg=PA334&lpg=PA334&dq=jak+uchov%C3%A1vat+ukazatele+v+kontejneru&source=web&ots=7eGhHXQx_O&sig=fxELnoFJuAK1rEtVCF91h5Om9BM&hl=cs&sa=X&oi=book_result&resnum=1&ct=result#PPA336,M1

Nahlásit jako SPAM
IP: 85.70.229.–
Zápisky z dění na FB (momentálně ve vývoji): http://fbpd.ic.cz/
Jura
~ Anonymní uživatel
634 příspěvků
12. 8. 2008   #3
-
0
-

Zdravím,

buď si napíšu nějaký wrapper, kterým obalím standartní vector(nelze od něj dědit, protože nemá virtuální destruktor!!! ) , překryju všechny potřebné metody a navíc o dealokaci se postarám sám v destruktoru. Nebo použiju inteligentní ukazatele s čítačem referencí. Jen musí být napsán inteligentně, pokud budu pracovat s více vlákny.

Nahlásit jako SPAM
IP: 85.207.192.–
AdamHlavatovic0
Stálý člen
13. 8. 2008   #4
-
0
-

> nelze od něj dědit, protože nemá virtuální destruktor!!!
ale ide, len potom vytvarat kolekcie obsahujuce ukazatele na rodicovsku triedu nieje celkom dobry napad prave s dovodu nepritomnosti virtualneho destruktora.

Nahlásit jako SPAM
IP: 217.73.16.–
karl820
Duch
13. 8. 2008   #5
-
0
-

To AdamHlavatovic : obecne se nedoporucuje delat potomky po tridach z STL.

Nahlásit jako SPAM
IP: 213.68.11.–
AdamHlavatovic0
Stálý člen
13. 8. 2008   #6
-
0
-

Otom by som sa chcel dozvedieť viacej, môžete uviesť zdroj(e) odkiaľ informácia pochádza.

Nahlásit jako SPAM
IP: 217.73.16.–
Jura
~ Anonymní uživatel
634 příspěvků
13. 8. 2008   #7
-
0
-

To AdamHlavatovic :

Sorry, blbě jsem to napsal, samozřejmě že pokud třída neobsahuje virtuální destruktor, tak to neznamená, že od ní nelze dědit. Jen jsem měl spíše na mysli něco takového:

template<typename T>

class CPtrVector : public std::vector<T>
{
typedef std::vector<T> _Base;
public:
explicit CPtrVector();
// dalsi metody

virtual ~CPtrVector()
{
// a tady budu pristupovat k rodicovske tride
// treba pres _Base::iterator nebo _Base::operator[]
// a chtit uvolnit pointery
}

};

int main()
{
std::vector<int*> * pPtrVector = new CPtrVector<int*>();
// ted to naplnim
// .......
// a ted to smazu
// a je pruser
// destruktory se zavolaji v nespravnem poradi
delete pPtrVector;

return 0
}


Nemel jsem to kde testovat, takze to berte s rezervou.

Nahlásit jako SPAM
IP: 84.244.86.–
AdamHlavatovic0
Stálý člen
13. 8. 2008   #8
-
0
-

ano, prave preto som dodal "... len potom vytvarat kolekcie obsahujuce ukazatele na rodicovsku triedu nieje celkom dobry napad prave s dovodu nepritomnosti virtualneho destruktora", alebo inak pokial nevyzadujeme polimorfne chovanie nasej odvodenej triedy, tak nepritomnost virtualneho destruktora nieje ziaden problem.

Nahlásit jako SPAM
IP: 217.73.16.–
yaqwsx+9
Posthunter
13. 8. 2008   #9
-
0
-

Díky za odpovědi. Napsal jsme si vlastní obslužnou třídu a problém s konstruktorem je vyřešený. A dík, že jste mě vyvedli z omylu, já myslel, že auto_ptr dělá hluboké kopie

Nahlásit jako SPAM
IP: 85.160.68.–
Life is too short to remove USB mass storage safely...
Správný drsňák udělá z konzole cokoliv
AdamHlavatovic0
Stálý člen
13. 8. 2008   #10
-
0
-

> že auto_ptr dělá hluboké kopie
pokial sa nemylim tak sa tomu hovory, ze zmena vlastnictva (ale nechce sa mi to overovat)

Nahlásit jako SPAM
IP: 217.73.16.–
karl820
Duch
15. 8. 2008   #11
-
0
-

To AdamHlavatovic : 1) STL kontejnery maji vsechny promeny private
2) bylo receno vyse - nemaji virtualni destruktor, vede k memory leakum
3) pro rozsirovani funkcionality se pouzivaji alghoritm nebo kompozice a adapter, ktery vlastni kontejner a pracuje nad nim

v boost existuje shared_ptr, ktery umoznuje ukladat do kontejneru ukazatele. jedna se o ref counter na pointer.
http://www.boost.org/

Nahlásit jako SPAM
IP: 213.68.11.–
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, 80 hostů

Podobná vlákna

Kontejner — založil Gadael

Alokování paměti — založil oxidián

Parametry flash animace — založil Lumen

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ý