Memcpy ukazatelu na objekty – C / C++ – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu
Reklama
Reklama

Memcpy ukazatelu na objekty – C / C++ – Fórum – Programujte.comMemcpy ukazatelu na objekty – C / C++ – Fórum – Programujte.com

 

Hledá se programátor! Plat 1 800 € + bonusy (firma Boxmol.com)
D-Fox0
Stálý člen
15. 1. 2010   #1
-
0
-

Mam tridu kde dynamicky alokuji 'ukazatel' na 'pole ukazatelu' meho 'objektu':

Point ** stack

volam tedy v pripade potreby svoji funkci na realokaci pole:

void Stack::realoc() {

arraySize += REALOC_SIZE;
Point ** aloc = new Point * [arraySize];

if (stack != NULL) {
std::memcpy ( aloc, stack, top * sizeof(Point));

/*
std::cout << stack[0]->getCol() << std::endl; // ret 5
std::cout << aloc[0]->getCol() << std::endl; // ret 5
aloc[0]->setCol(1);
std::cout << stack[0]->getCol() << std::endl; // ret 1
std::cout << aloc[0]->getCol() << std::endl; // ret 1
*/

delete [] * stack;
}
stack = aloc;
}


//'arraySize' je aktualni velikost pole, 'top'je pocet prvku v poli a 'REALOC_SIZE' je konstanta o kterou pole zvetsuji, getCol vraci int...

z radek zakomentovaneho kodu je videt oc mi jde. Kopiruji pamet, ale zkopiruji se pravdepodobne jen ukazatele na objekty. Predpokladam, ze to nebude tim, ze nemam ve sve tride Point "kopirujici konstruktor" a pretizeny operator "=" pro hlubokou kopii, protoze trida point obsahuje jen dva integery. Takze otazka tupeho javisty je: jak spravne pouzit memcpy, aby se zkopirovaly i objekty :)

Nahlásit jako SPAM
IP: 94.113.44.–
Reklama
Reklama
KIIV+42
God of flame
15. 1. 2010   #2
-
0
-

kdyz uz delas zasobnik, neni na to lepsi spojovy seznam? aby objekt obsahoval i ukazatel na nasledovnika (pripadne null pokud je konec)

Nahlásit jako SPAM
IP: 80.250.1.–
Program vždy dělá to co naprogramujete, ne to co chcete...
liborb
~ Redaktor
+18
Guru
16. 1. 2010   #3
-
0
-

memcpy kopíruje obsah paměti z jedné adresy na druhou. Nijak data neanalyzuje, takže pole bajtů nebo pole objektů je pro ní to samé :-).
Máš pole ukazatelů na objekty, které překopíruješ jinam, ale ty objekty přece neměníš resp. jejich umístění, takže jim zůstanou původní adresy a takže překopírovat jenom ukazatele by mělo stačit.
Druhá věc je samotný kód a vůbec zvolený způsob. Jednak v tom memcpy by měla být velikost ukazatele na Point a ne velikost Point. Pak je vhodné alokovanou paměť před prvním použitím mazat.
A ke zvolenému způsobu už ti radil KIIV. Pokud často zvětšuješ potřebnou paměť, tak je lepší seznam nebo v tvém případě i seznam polí o velikosti dané tvoji konstantou. Ale to už je skoro jedno.

Nahlásit jako SPAM
IP: 91.203.96.–
D-Fox0
Stálý člen
16. 1. 2010   #4
-
0
-

Potreboval jsem to mit rychle hotovy, tak sem pouzil pole namisto spojaku. Nakonec se ukazalo, ze spojak sem mel hotovy za 10 min a zdrojak obsahoval 2x mene kodu. To mam za to, ze sem tak linej :)

Nahlásit jako SPAM
IP: 94.113.44.–
Quiark0
Věrný člen
19. 1. 2010   #5
-
0
-

Já bych jen dodal, že když neumím pracovat s ukazateli (anebo když pro lowlevel práci s pamětí nemám dobrý důvod), tak použiju vector<>, list<> nebo tak něco. A vůbec, memcpy na objekty je velké fuj :)

Nahlásit jako SPAM
IP: 193.170.48.–
Wizard0
Stálý člen
19. 1. 2010   #6
-
0
-

To Quiark : To zalezi aky objekt kopirujes. Preca len kopirovanie pomocou memcpy bude vzdy rychlejsie ako vytvorenie noveho objektu (pouzitim copy konstruktoru) a popripade zmazanie stareho. Samozrejme nie kazda trieda je postavena tak aby sa jej objekty dali kopirovat pomocou memcpy resp. memmove.

Nahlásit jako SPAM
IP: 85.216.193.–
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, 65 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ý