Non capisco una cosa. Ad esempio, dichiaro di classe A e di classe B, che è un figlio di A:Oggetti dinamici C++. Come viene determinata la dimensione dell'oggetto durante il runtime?
class A {
public:
int a;
}
class B : public A {
public:
int b;
}
Ovviamente, se creo istanze di A o B, la loro dimensione nella memoria può essere determinato dal tipo.
A instanceA; // size of this will probably be the size of int (property a)
B instanceB; // size of this will probably be twice the size of int (properties a and b)
Ma cosa succede se creo istanze dinamiche e poi le liberiamo in seguito?
A * instanceAPointer = new A();
A * instanceBPointer = new B();
Queste sono istanze di classi diverse, ma il programma li considereranno come istanze della classe A. Questo va bene durante l'utilizzo di loro ma per quanto riguarda liberandoli? Per liberare memoria allocata, il programma deve conoscere la dimensione della memoria da liberare, giusto?
Quindi, se scrivo
delete instanceAPointer;
delete isntanceBPointer;
Come funziona il programma sa, la quantità di memoria, a partire dall'indirizzo ogni puntatore punta a, si deve liberare? Perché ovviamente gli oggetti hanno dimensioni diverse, ma il programma li considera di tipo A.
Grazie
Forse questo collegamento sarà d'aiuto? http://www.openrce.org/articles/files/jangrayhood.pdf – OldProgrammer
In realtà, sembra che il secondo potrebbe causare una perdita di memoria, dal momento che non è una classe polimorfica. Se la classe è polimorfica, il compilatore è in grado di deallocarla in base al tipo dinamico, utilizzando RTTI o qualche altro metodo e liberando automaticamente la stessa quantità di memoria effettivamente allocata. Se la classe non è polimorfica, tuttavia, non credo che sia garantita la possibilità di gestire correttamente questa situazione, quindi è sempre necessario eliminarla tramite un puntatore del tipo corretto. –
@JustinTime Per classe polimorfica intendete classe con distruttore virtuale? –