Newsgroup: it.comp.lang.c++
Titolo: Per esperti: dubbio su tipi di allocazione

Ho un dubbio che mi assilla da parecchio tempo.
Se alloco una classe nel seguente modo
MyClass *mc=new MyClass();
la variabile di classe vett, dichiarata nel seguente modo, va nello heap 
o nello stack?
class MyClass
{
	vett[200]
};
Ringrazio in anticipo a chi mi rispondera'
Ciao e Buon Anno a tutti
Franco


mc sta nell'heap e vett nello stack
Maurus


Potrei sbagliarmi, ma le mie conoscenze mi portano a dire il contrario: mc
nello STACK, in quanto puntatore locale alla scope in cui lo dichiari (e
questo si sa bene, le variabili locali non static vanno nello stack), mentre
la classe che successivamente allochi (con quindi il relativo array vett)
nello HEAP; non a caso, infatti, ciò che è allocato dinamicamente con new va
manualmente deallocato con delete, proprio in quanto non risiede nello
stack, dove le variabili vengono automaticamente "distrutte" all'uscita del
loro scope.
Spero di essere stato chiaro e di non aver detto stupidaggini.
Saluti,
Sergio
P.S.
Prova a fare questo esercizietto: dichiara due puntatori alla tua classe, ad
esempio *mc1 e *mc2, rispettivamente con scope globale e locale;
successivamente nello scope locale alloca con new due oggetti ed esci da
tale scope; se, a questo punto, proverai a riferirti a mc2 otterrai un
errore (in compilazione) relativo al fatto che mc2 non è più visibile nel
nuovo scope, ma ciò che hai allocato e a cui puntava mc2 esisterà sempre
(finchè ovviamente non lo deallochi con delete ma ricorda che per farlo hai
bisogno del puntatore)!
Infatti, prova a riferirti a mc1 nel nuovo scope: non darà alcun problema in
quanto mc1 è globale e l'oggetto allocato sarà ancora presente (sebbene
allocato nel precedente scope locale) in quanto posto nello heap.
Fammi sapere, se vuoi, ciao.

 };
Effettivamente mc e' un puntatore a MyClass che puntera' all'oggetto
allocato dinamicamente, che quindi va nell'heap.
Ma questo significa che tutto l'oggetto, istanza di MyClass va nell'heap e
quindi anche vett, come giustamente hai detto tu.
Quello su cui non mi trovi d'accordo e' sul fatto che mc sia sicuramente
nello stack.
Bisogna vedere se lo scope di mc e' locale o globale.
Nel primo caso ok, ma se lo scope di mc e' globale, dove va a finire?
Maurus


Di certo non nello stack, ma questo era sottointeso.
Nel caso lo scope sia globale, il puntatore andrà nell'aria di memoria
"static", come spiegato dall'illustre Bjarne Stroustrup, dove risiedono
anche variabili e oggetti static.
Saluti,
Sergio

Pensandoci bene credo che vada tutto nello heap, in quanto allocato con 
new; che sia globale o locale non credo cambi molto.
Il vettore non e' altro che una variabile, e una variabile di classe va 
nello heap quando la classe di appartenenza e' allocata con new.
Il dubbio mi era venuto confrontando col caso in cui anche vett fosse 
allocato nel costruttore, es.:
MyClass::MyClass()
{
	vett=new double[200];
}
e deallocata nel distruttore
MyClass::~MyClass()
{
	delete [];
}
La sola differenza e' che nel secondo caso vett si possa allocare con 
lunghezza variabile dinamicamente.
Ciao Franco


Se leggi attentamente, la differenza (assolutamente non banale) tra locale e
globale riguardava il puntatore mc e non l'oggetto allocato dinamicamente;
questi, infatti, viene sicuramente ed in ogni caso, come ripetutamente detto
in precedenza, allocato nello heap.
Saluti,
Sergio