Miért nem jó? Virtualis függvények.
//main.cpp
# include <iostream>
typedef unsigned short ushort;
typedef unsigned int uint;
using namespace std;
class Mammal {
public:
Mammal() { cout <<"Mammal Konstruktor \n"; }
Mammal(const Mammal &rhs);
virtual ~Mammal() { cout <<"Mammal virtual Destruktor \n"; }
virtual Mammal* Copy()const { return new Mammal(*this); }
void SetAge(short age) { itsAge = age; }
short GetAge()const { return itsAge; }
protected:
short itsAge;
private: };
class Dog: public Mammal {
public:
Dog(): Mammal() { cout <<"Dog Konstruktor \n"; }
Dog(const Dog &rhs);
virtual ~Dog() { cout <<"Dog virtual Destruktor \n"; }
virtual Mammal* Copy()const { return new Dog(*this); }
protected:
private: };
Mammal::Mammal(const Mammal &rhs): itsAge(2) {
cout <<"Mammal copy Konstruktor \n"; }
Dog::Dog(const Dog &rhs): Mammal(rhs) {
cout <<"Dog copy Konstruktor \n"; }
int main() {
const Mammal *const pMammal = new Dog;
Mammal *pArray[1] = pMammal->Copy();
return 0; }
//main.cpp
# include <iostream>
typedef unsigned short ushort;
typedef unsigned int uint;
using namespace std;
class Mammal {
public:
Mammal() { cout <<"Mammal Konstruktor \n"; }
Mammal(const Mammal &rhs);
virtual ~Mammal() { cout <<"Mammal virtual Destruktor \n"; }
virtual Mammal* Copy()const { return new Mammal(*this); }
void SetAge(short age) { itsAge = age; }
short GetAge()const { return itsAge; }
protected:
short itsAge;
private: };
class Dog: public Mammal {
public:
Dog(): Mammal() { cout <<"Dog Konstruktor \n"; }
Dog(const Dog &rhs);
virtual ~Dog() { cout <<"Dog virtual Destruktor \n"; }
virtual Mammal* Copy()const { return new Dog(*this); }
protected:
private: };
Mammal::Mammal(const Mammal &rhs): itsAge(2) {
cout <<"Mammal copy Konstruktor \n"; }
Dog::Dog(const Dog &rhs): Mammal(rhs) {
cout <<"Dog copy Konstruktor \n"; }
int main() {
const Mammal *const pMammal = new Dog;
Mammal *pArray[1] = pMammal->Copy();
delete [] pArray; /*Üres [] jelezzük,hogy az egész tömb tartalmát törölni szeretnénk és nem csak a tömb első elemét.*/
return 0; }
//error: array must be initialized with a brace-enclosed initializer|
Pontosan ez: //error: array must be initialized with a brace-enclosed initializer
Mammal *pArray[1] = pMammal->Copy();
A brace enclosed azt jelenti, hogy {}-be van zárva.
Ha azt írom, hogy
int array[1] = 1;
az szerinted helyes? Most tömböt vagy intet hozok létre?
Amúgy ez hibás:
/*Üres [] jelezzük,hogy az egész tömb tartalmát törölni szeretnénk és nem csak a tömb első elemét.*/
delete-t hívni delete[] helyett undefined behavior, jó esetben csak törli az első elemet, és békénhagyja a tömböt, rossz esetben formázza a merevlemezt, és elküldi a gyerekpornó képeidet az fbi-nak.
iostream kielégítőbb választ is adhatnál.
Te csak le írod,hogy nem jó és kérdezgetsz.
A megoldás meg sehol.
int main() {
const Mammal *const pMammal = new Dog;
Mammal *pArray[1] = {pMammal->Copy()};
return 0; }
Így már jó de a deletes gondot már nem értem.
Az a memóriacím ami bekerül a mutató tömbbe az egy dinamikus memóriában levő objektumra mutat.
Azok nem szabadulnak fel maguktól csak ha véget ér a program az én esetemben igen most véget ér de szeretném megírni a felszabadítását is.
Azt pedig így kell:
delete [] pArray; //Mi a rossz ebben nem értem.
delete pArray; //Így is jó mert csak egy eleme van a tömbnek.
"Azt pedig így kell:
delete [] pArray; //Mi a rossz ebben nem értem.
delete pArray; //Így is jó mert csak egy eleme van a tömbnek."
Csak azt akartam mondani, hogy a delete pArray NEM JÓ. Te úgy gondolod, hogy csak törli az első elemet, pedig nem, bármi megtörténehet, undefined behavior.
De hát akkor az okosok által írt könyv rosszat mond?
A könyv szerint ez az egész tömb tartalmát törli nem csak az első elemet:
delete [] pArray; //ugye mert ezzel jelezzük [],hogy az egész tömb tartalmát törölni szeretnénk.
Így pedig csak az első elemét töröljük:
delete pArray
"Te úgy gondolod, hogy csak törli az első elemet, pedig nem, "
Akkor a könyv hülyeséget ír?
Akkor ez mit csinál ha nem az első elemét törli
delete pMammal;
beugrott valami lehet hogy már értem.
De azon a memóriacímen ami a tömbbe van az dinamikusan létrehozott objektumra mutat.
Akkor ez a program tartalmaz egy nagy memória elszivárgást mert nem tudom törölni ezt az objektumot.
return new Dog(*this); //itt hozom létre dinamikusan és ennek az újonnan dinamikusan létrehozott objektumnak a visszatérési értéke egy memóriacím ami erre az objektumra mutat.
És ez a memóriacím kerül bele a pArrayba.
Kapcsolódó kérdések:
Minden jog fenntartva © 2024, www.gyakorikerdesek.hu
GYIK | Szabályzat | Jogi nyilatkozat | Adatvédelem | Cookie beállítások | WebMinute Kft. | Facebook | Kapcsolat: info(kukac)gyakorikerdesek.hu
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!