2010-10-31 31 views
1

dans le code suivant, comment - en termes de gestion de la mémoire - class A est allouée et désallouée en .NET (C#).Gestion de la mémoire pour une classe

class A 
{ 
    public static m1(int x, int y) 
    { 
     int x, y; 
     return x+y; 
    } 
    int m2(int p, int q) 
    { 
     int p, int q; 
     return p+q; 
    } 
    int x=10; 
    int y; 
    const int x=10; 
    readOnly y=20; 

    public int x 
    { 
     get {y} 
     set {y=value} 
    } 
} 

class B 
{ 
    A a=new A(); // what happens when initializing class A; 
} 

Note: que l'utilisation de class B pourrait être le point d'entrée du programme, ou une instance d'objet, mais la portée est ici sur la gestion de la mémoire et de l'allocation de l'instance de class A.

+7

Pourriez-vous s'il vous plaît fournir un exemple de code qui compile. Vous avez un échantillon ci-dessus a beaucoup de problèmes qui rend très difficile de fournir l'information que vous recherchez. –

+0

A quel niveau voulez-vous être au courant de l'allocation? Si c'est une allocation par pile ou par tas? Quand les objets sont-ils collectés? Quand pendant l'exécution l'allocation a-t-elle lieu? Ou qu'est-ce qui est attribué lorsque vous faites 'A a = new A()'? Pouvez-vous clarifier votre question? –

+0

Albin Sunnanbo: _ Oui je pense à tous les points comme tu le dis ci-dessus. – NoviceToDotNet

Répondre

1

La ligne que vous décrivez alloue une instance unique de A sur le tas lorsque vous créez une nouvelle instance de B. Ainsi,

B b = new B(); 

allouera deux objets: un B avec l'appel direct et un A dans le cadre de la construction du B.

La ligne elle-même fait rien jusqu'à ce que vous créez une instance de B.

A semble avoir trois champs qui ne sont pas des champs de référence, donc il ne crée pas de nouveaux objets sur le tas mais fait partie de l'instance A.

C'est à peu près toute la mémoire allouée dans cet exemple.

EDIT:

Pour plus de clarté - Un lien de référence à un article expliquant la pile et Heap, et les considérations d'allocation de mémoire: http://www.simple-talk.com/dotnet/.net-framework/.net-memory-management-basics/

+0

et qu'advient-il de ces méthodes de classe A seront-ils alloués en tas et là variable locale dans la pile et la variable de classe seront allouées en tas et variable statique et les méthodes seront allouées en pile est-ce vrai? – NoviceToDotNet

+0

Les variables statiques sont allouées dans le tas et les méthodes n'occupent pas d'espace; ils ne sont pas alloués. –

+0

alors les variables locales des méthodes sont allouées dans la pile et lorsque la méthode se termine automatiquement, la mémoire de pile est libérée et les variables de classe non statiques sont allouées dans le tas. Lesquels sont libérés par GC si la mémoire CLR et les variables statiques sont libérées après que nous les ayons définies NULL. Suis-je correct laissez-moi maintenant .... Maintenant, je ne veux pas trop se concentrer sur l'allocation de mémoire et de allocations – NoviceToDotNet

1

Lorsque vous créez une instance de B, la mémoire est allouée pour 1 objet avec un champ de type de référence ("A"). Juste après la création de cette nouvelle instance de A qui provoque l'allocation de mémoire pour l'objet avec deux champs "int" ("x", "y") et avec un champ de type TYPE IS UNKNOWN.