Diskuze: pretazenie =
V předchozím kvízu, Online test znalostí C++, jsme si ověřili nabyté zkušenosti z kurzu.
Zobrazeno 7 zpráv z 7.
//= Settings::TRACKING_CODE_B ?> //= Settings::TRACKING_CODE ?>
V předchozím kvízu, Online test znalostí C++, jsme si ověřili nabyté zkušenosti z kurzu.
Operator= nieje zavolaný pretože binFileArch aj binFile sú ukazatele, a teda na poslednom riadku len meníš na čo ukazuje. Ak chceš aby sa operator= zavolal na objekte musíš získať objekt na ktorý pointer ukazuje.
*(backUp[numOfBackUps].binFileArch) = *binFile;
to mi nenapadlo, diky, nechce sa mi zakladat nove vlakno tak skusim tu este, nevies nahodou ako spravit hlboku kopiu tohto? takto mi to hadze segfaulty
class CData
{
private:
uint32_t version;
uint8_t block[50];
public:
....
CData & operator=(const CData & a){
version = a.version;
for (int i = 0; i < 50; i++)
block[i] = a.block[i];
return *this;
}
};
Nevidím tam žiadny problém chyba musí byť niekde inde. Skontroluj si či máš správne inicializované ukazatele, či si ich náhodou neuvoľnil, atď.
no valgrind my hlasi chybu v tomto :
==8249== Use of uninitialised value of size 8
==8249== at 0x4020E2: CData::operator=(CData const&) (in /home/expoox/Dokumenty/BI-PA2/du4/a.out)
==8249== by 0x40113D: CFile::AddVersion() (in /home/expoox/Dokumenty/BI-PA2/du4/a.out)
==8249== by 0x401B62: main (in /home/expoox/Dokumenty/BI-PA2/du4/a.out)
==8249==
==8249== Invalid write of size 4
==8249== at 0x4020E2: CData::operator=(CData const&) (in /home/expoox/Dokumenty/BI-PA2/du4/a.out)
==8249== by 0x40113D: CFile::AddVersion() (in /home/expoox/Dokumenty/BI-PA2/du4/a.out)
==8249== by 0x401B62: main (in /home/expoox/Dokumenty/BI-PA2/du4/a.out)
==8249== Address 0x0 is not stack'd, malloc'd or (recently) free'd
ale nechapem co tym mysli kedze v konstruktore premennu version nulujem a zistil som ze to pada na riadku
version = a.version;
Chyba nieje v "funkci-i" operator=, ale v tom že jeden z objektov ktoré používaš už neexistuje. Aby si to lepšie pochopil prikladám tento kód.
class CData
{
private:
uint32_t version;
uint8_t block[50];
public:
CData & operator=(const CData & a){
version = a.version;
for (int i = 0; i < 50; i++)
block[i] = a.block[i];
return *this;
}
};
int main()
{
CData a;
CData b;
a = b; //Toto je v poriadku, to dokazuje ze chyba nieje v operator-e
CData *ptr = NULL;
CData &ref = *ptr; //referencia teraz ukazuje na nieco co neexistuje
a = ref; //Chyba
ref = a; //Chyba
}
Takže si musíš všetko skontrolovať (kde operator= voláš, kde inicializuješ pointr-e,atď..)
dobre mam to, chyba bola v tom ze som mal dynamicke pole dynamickych poli ale to vnutorne pole nebolo naalokovane, takze si mal pravdu, dakujem
Zobrazeno 7 zpráv z 7.