2010-06-26 10 views

Répondre

3

Cela signifie que toutes les données de l'objet est alloué sur la pile, et sera sauté lorsque le procédé actuel se termine. L'alternative (qui se produit en C# et Java, ou si vous utilisez un pointeur en C++) est d'avoir une référence ou un pointeur sur la pile, qui fait référence aux données d'objet qui sont allouées sur le tas.

Je pense que la « ligne » ici signifie simplement « dans le cadre du cadre de pile pour cette méthode » par opposition à partir de la méthode existante séparément.

2

Eh bien, vous savez ce que la pile est, non? Si vous déclarez une fonction, par exemple, C:

int foo() { 
    int bar = 42; 
    return bar; 
} 

Lorsque la fonction est appelée, un espace est créé pour obtenir des informations sur la fonction sur la pile, et l'entier bar est attribué aussi. Lorsque la fonction revient, tout ce qui est dans cette pile est désalloué.

Maintenant, en C++:

class A { 
    int a; 
    int b; 
    A(int x, int y) { 
     a = x; 
     b = y; 
    } 
    ~A() { // destructor 
     cout << "A(" << a << "," << b << ") being deleted!" << endl; 
    } 
} 

void foo() { 
    A on_the_stack(1,2); 
    A *on_the_heap = new A(3,4);   
} 

Dans les langues comme Java, sont attribués tous les objets sur le tas (à moins que le compilateur ne une sorte d'optimisation). Mais dans certaines langues comme C++, les objets de classe peuvent aller directement sur la pile, tout comme int s ou float s. La mémoire du tas n'est pas utilisée sauf si vous appelez explicitement new. Notez que notre objet on_the_heap ne se désalloue jamais (en appelant le delete), ce qui provoque une fuite de mémoire. Par contre, l'objet on_the_stack est automatiquement désaffecté lorsque la fonction retourne, et son destructeur sera appelé avant de le faire.