Question

Dans mon browsings entre l'Internet, je suis tombé sur ce post, qui comprend cette

"(Bien écrit) C++ va à la grande longueurs de faire de la pile automatique les objets de travail "comme" primitives, comme en témoigne de Stroustrup conseils "faire ce que l'ints faire".Cela nécessite une beaucoup plus de respect pour la les principes de l'Orienté Objet développement:votre classe n'est pas droit jusqu'à ce qu'il "fonctionne comme" un int, à la suite de la "Règle de Trois" qui les garanties qu'il peut (tout comme un int) être créé, copié, et correctement détruit comme une pile automatique."

J'ai fait un peu de C, et C++ code, mais juste en passant, jamais rien de grave, mais je suis juste curieux, ce que cela signifie exactement?

Quelqu'un peut-il donner un exemple?

Était-ce utile?

La solution

Empiler des objets sont gérés automatiquement par le compilateur.

Lorsque la portée est de gauche, il est supprimé.

{
   obj a;
} // a is destroyed here

Lorsque vous faites la même chose avec un " newed l'objet d'une fuite de mémoire :

{
    obj* b = new obj;
}

b n'est pas détruit, de sorte que nous avons perdu la capacité à récupérer la mémoire b est propriétaire.Et peut-être pire, l'objet ne peut pas nettoyer lui-même.

En C, la suite est commune :

{
   FILE* pF = fopen( ... );
   // ... do sth with pF
   fclose( pF );
}

En C++ nous écrire ceci :

{
   std::fstream f( ... );
   // do sth with f
} // here f gets auto magically destroyed and the destructor frees the file

Quand nous oubliez pas d'appeler la fonction fclose dans le C de l'échantillon le fichier n'est pas fermé et ne peuvent pas être utilisés par d'autres programmes.(par ex.il ne peut pas être supprimé).

Un autre exemple démontrant l'objet chaîne de caractères, qui peuvent être construits, assigné et qui est détruit à la sortie de la portée.

{
   string v( "bob" );
   string k;

   v = k
   // v now contains "bob"
} // v + k are destroyed here, and any memory used by v + k is freed

Autres conseils

En plus des autres réponses:

Le langage C++ a effectivement l' auto mot-clé à déclarer explicitement la classe de stockage d'un objet.Bien sûr, c'est complètement inutile parce que c'est l'implicite de classe de stockage pour les variables locales et ne peut pas être utilisé n'importe où.À l'opposé de auto est static (à la fois localement et globall).

Les déclarations suivantes sont équivalentes:

int main() {
    int a;
    auto int b;
}

Parce que le mot clé est totalement inutile, il va être recyclé dans la prochaine norme C++ (C++0x”) et obtient un nouveau sens, à savoir, il permet au compilateur de déduire le type de variable à partir de son initialisation (comme var en C#):

auto a = std::max(1.0, 4.0); // `a` now has type double.

Les Variables en C++ peut être déclaré sur la pile ou le tas.Lorsque vous déclarez une variable en C++, il se met automatiquement sur la pile, sauf si vous explicitement l'utilisation de l'opérateur new (il va sur le tas).

MyObject x = MyObject(params); // onto the stack

MyObject * y = new MyObject(params); // onto the heap

Cela fait une grande différence dans la façon dont la mémoire est gérée.Quand une variable est déclarée sur la pile, il sera libéré quand elle est hors de portée.Une variable sur le tas ne sera pas détruit jusqu'à supprimer est explicitement appelée sur l'objet.

Pile automatique sont des variables qui sont allouées sur la pile de la méthode actuelle.L'idée derrière la conception d'une classe qui peut agit comme Pile automatique est qu'il doit être possible d'initialiser avec un appel et de le détruire avec l'autre.Il est essentiel que le destructeur libère toutes les ressources allouées par l'objet et de son constructeur renvoie un objet qui a été entièrement initialisé et prêt à l'emploi.De même pour l'opération de copie de la classe doit pouvoir être facilement fait des copies, qui sont entièrement fonctionnels et indépendants.

L'utilisation de cette catégorie doivent être de la même façon primitive int, float, etc.sont utilisés.Vous les définir (éventuellement de leur donner une certaine valeur initiale), puis à les transmettre autour de, et à la fin, laisser le compilateur pour le nettoyage.

Corrigez-moi si je me trompe, mais je pense que l'opération de copie n'est pas obligatoire pour profiter pleinement de pile automatique de nettoyage.Par exemple, considérons un classique MutexGuard objet, il n'a pas besoin d'une opération de copie, pour être utile, sous forme de pile automatique, ou est-il ?

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top