Zvětšení pole (jako atributu třídy) – C / C++ – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Zvětšení pole (jako atributu třídy) – C / C++ – Fórum – Programujte.comZvětšení pole (jako atributu třídy) – C / C++ – Fórum – Programujte.com

 

Toto vlákno bylo označeno za vyřešené.
Šťouchal0
Stálý člen
1. 4. 2012   #1
-
0
-

Zdravím,

mám třídu, jejímž atributem je pole (struktury). Potřeboval bych jej sem tam nafouknout  (realokovat), řekněme geometricky (nepoužívám nic z STD, jelikož zadáním je si s tím pořádně pohrát právě bez vektorů apd.).

Vše funguje, akorát mám problém s memory leaky. V každém volání realokace se mi 1 úsek neuvolní. - Nevíte, čím to je, jak to opravit (prosím, nejlépe i odůvdnění, chtěl bych tomu přijít na kloub)? :-)

class MyClass
{
	public:
		...
	private:
		int sizeArray;
		TRecord *p;
		void realocate( void );
		...
};

...
MyClass::MyClass( void ) 
{
	sizeArray = 1; // @todo
	lastIndex = -1;

	p = new TRecord[sizeof(TRecord) * sizeArray];
}



MyClass::~MyClass( void )
{
	delete[] p;
}



void MyClass::realocate( void )
{
	int oldSize = sizeArray;
	sizeArray = oldSize * 2;
	TRecord *newArray = new TRecord[sizeof(TRecord) * sizeArray];
	
	for (int i = 0; i < oldSize; i++)
		newArray[i] = p[i];

	TRecord *p = new TRecord[sizeof(TRecord) * sizeArray];
	p = newArray;
	delete[] newArray;
}
Nahlásit jako SPAM
IP: 213.168.191.–
crazy
~ Moderátor
+10
Grafoman
1. 4. 2012   #2
-
+1
-
Zajímavé

#1 Šťouchal


void MyClass::realocate( void )
{
	int oldSize = sizeArray;
	sizeArray = oldSize * 2;
	TRecord *newArray = new TRecord[sizeArray];
	
	for (int i = 0; i < oldSize; i++)
		newArray[i] = p[i];

	delete[] p;
	p = newArray;
}


a při alokaci pomocí operátoru new nepoužívej ten sizeof(), stačí počet, protože takto toho alokuješ více než chceš... new si tu velikost typu zjistí sám...

Nahlásit jako SPAM
IP: 89.190.90.–
All you need is vision and time.
KIIV
~ Moderátor
+43
God of flame
1. 4. 2012   #3
-
+1
-
Zajímavé

a ten samotnej memory leak je toto:

TRecord *p = new TRecord[sizeof(TRecord) * sizeArray]; // predefinuje se p na lokalni hodnotu!!!
p = newArray; // zahodi se pointer pred momentem alokovany
delete[] newArray; // deletne se cosi jineho
Nahlásit jako SPAM
IP: 94.112.32.–
Program vždy dělá to co naprogramujete, ne to co chcete...
Šťouchal0
Stálý člen
1. 4. 2012   #4
-
0
-

#2 crazy
děkuji, to mi uniklo :-)

#3 KIIV
Chápu - díky. Jen mě nenapadá, jak to vyřešit. Pomocné pole s dvojnásobnou velikostí si udělám stejně, překopíruji prvky. Ale jak potom řeknu atributu p, že má ukazovat na nové pole a to staré smáznout?

Nahlásit jako SPAM
IP: 213.168.191.–
KIIV
~ Moderátor
+43
God of flame
1. 4. 2012   #5
-
+1
-
Zajímavé

crazy to ma dobre

jinak zdvojnasobovat velikost je trochu rizikovy... nestacilo by pridavat nejakej pocet?

taky zablokuj copy kontstuktor a tak

+ na takovy "kopirovani bloku" by bylo lepsi pouzivat jen pole ukazatelu na ty data.. a alokovat kazde zvlast... vyhnes se vecem jako ze TRecord bude treba 10kB dlouha struktura - to se docela dlouze kopiruje (oproti stejnemu poctu 4/8B pointeru)

Nahlásit jako SPAM
IP: 94.112.32.–
Program vždy dělá to co naprogramujete, ne to co chcete...
Šťouchal0
Stálý člen
1. 4. 2012   #6
-
0
-

Ajo, už to vidím.

#5 KIIV
Funguje.

- přidávám to pro testovací prostředí (úkol do školy). Kdyby to bylo na ostro, tak bych mohl chvíli přidávat dvojnásobek (abych nemusel často pužívat režii pro kopírování) a pak na nějaké hranici přidávat už jen konstattní hodnotu?

- kopírovací konstruktor apd. jsem zatím nepotřeboval (teprve se s Cpp učím), ale jak to ppůjde tak se na to podívám, případně napíši :-)

Mockrát děkuji oběma.

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