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;
}
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...
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...
#3KIIV
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?
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...
- 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 :-)