2011-03-16 3 views
4

Dans le livre de « Le langage C++ », l'auteur a affirméinitialisation objet

Parfois, lorsque vous concevez une bibliothèque, il est nécessaire, ou tout simplement pratique, d'inventer un type avec un constructeur et un destructeur dans le seul but de l'initialisation et du nettoyage. Un tel type ne serait utilisé qu'une seule fois: pour allouer un objet statique de sorte que le constructeur et le destructeur soient appelés.

Je suis intéressé par le type de scénario auquel cette déclaration fait référence? Ou comment cette déclaration aide la conception du logiciel?

Le livre donne également un exemple

class Zlib_init{ 
    Zlib_init(); 
    ~Zlib_init(); 
}; 

class Zlib{ 
    static Zlib_init x; 
} 

Et le livre affirme que

Malheureusement, il n'est pas garanti qu'un tel objet est initialisé avant sa première utilisation et détruit après sa dernière utilisation dans un programme constitué d'unités compilées séparément.

Pourquoi cela peut-il se produire?

Merci pour votre clarification.

+0

Vous avez la garantie qu'un tel objet sera créé avant que Main ne soit appelée et détruite après les retours principaux. En tant que tel, vous pourriez être tenté de dire "mais, mais ... tout est bon". Malheureusement, vous pourriez avoir un objet statique différent quelque part dans votre programme qui utilise aussi l'objet Zlib_init, et le langage C++ ne garantit pas que celui-ci sera créé ou détruit avant ou après cet objet ou tout autre objet, dès qu'ils sont dans différentes unités de compilation. Donc, le libellé est peut-être un peu pédant, mais c'est 100% correct. (Bon, c'est correct quand même, puisque c'est Stroustrup). – Damon

Répondre

2

La norme C++ ne spécifie pas l'ordre dans lequel les objets statiques sont créés. Par conséquent, si vous avez besoin d'une hiérarchie dans les objets statiques, vous avez besoin qu'ils dépendent l'un de l'autre (par exemple, l'un devrait être le membre de l'autre). La construction du livre garantit ce comportement. Par exemple, un moteur de jeu hypothétique a besoin de moteurs sonores et graphiques pour fonctionner, si vous les déclarez comme des objets statiques dans des unités de compilation séparées, et utilisez les uns des autres, il n'y a aucune garantie que comme vous l'avez spécifié. Voir l'entrée C++ faq pour la deuxième partie de votre question.

+0

Dans la même unité de compilation, ils sont construits dans l'ordre de leur définition (pas de déclaration). Le problème est quand ils sont répartis entre plusieurs unités ... –

+0

Merci, j'ai corrigé la réponse. – vissi

0

Malheureusement, il n'est pas garanti qu'un tel objet est initialisé avant sa première utilisation et détruit après sa dernière utilisation dans un programme constitué d'unités compilées séparément.

Par exemple, si vous avez une instance de votre classe de stockage sur static dans un module et que vous voulez l'utiliser à partir d'un autre constructeur de classe de stockage sur static dans un autre module. Dans ce cas, vous impliquez que la première instance sera initialisée avant la seconde. Mais la langue n'a aucun moyen de spécifier cet ordre si les instances sont définies dans des modules séparés.

Parfois, lorsque vous concevez une bibliothèque, il est nécessaire, ou tout simplement pratique, d'inventer un type avec un constructeur et un destructor dans le seul but de l'initialisation et le nettoyage. Un tel type ne serait utilisé qu'une seule fois: pour allouer un objet statique de sorte que le constructeur et le destructeur soient appelés.

Ceci est utile lorsque vous travaillez avec 3-ème en partie libs nécessitant l'initialisation et des appels de finalisation.Par exemple WinSock 2 nécessite WSAStartup avant de pouvoir appeler d'autres fonctions WSA et WSACleanup lorsque vous avez terminé avec WinSock dans votre processus. Si vous avez une instance statique de ce type de classe appelant WSAStartup dans le constructeur et WSACleanup dans le destructeur, vous devriez pouvoir utiliser les fonctions WSA dans d'autres endroits de votre programme (sauf les constructeurs/destructurs d'autres objets statiques).

Questions connexes