Questionnaire Vous êtes : Votre adresse mail : Votre groupe de TP: Initiaux GR1 (avec Henri Derycke) Initiaux GR2 (avec Anthony Labarre) Alternants GR3 (avec Victor Marsault) 1. Quels sont les avantages et les inconvénients de la pile par rapport du tas ? 2. A quoi sert le mot-clef delete[] ? 3. Quels sont les deux événements qui délimitent la durée de vie d’une donnée ? 4. Qu’est-ce qu’une dangling-reference ? Donnez un exemple de situation dans lequel on peut en avoir une. Les prochaines questions font référence au code suivant : class Toto { public: Toto(int v1) : _v4(_v3), _v1(v1), _v2(_v5) { _v3 = 3; } private: int _v1 = 1; int _v2 = 2; int _v3; int _v4 = 4; int _v5 = 5; } 5. Dans quel ordre sont instanciés les attributs de la classe ? 6. Quelles sont leurs valeurs après la construction d’une instance de Toto ? class Dictionary { public: void add_definition(std::string word, std::string definition) { _definitions_by_words[word].emplace_back(definition); } std::vector<std::string> get_definitions(std::string word) const { return _definitions_by_words[word]; } std::string get_first_definition(std::string word) const { auto it = _definitions_by_words.find(word); if (it != _definitions_by_words.end()) { auto found_definitions = it->second; if (found_definitions.empty()) { return found_definitions.front(); } } auto default_value = std::string { "No definition found for " } + word; return default_value; } private: std::map<std::string, std::vector<std::string>> _definitions_by_words; }; 7. Réécrivez les fonctions-membres de la classe Dictionary de manière à éliminer les copies inutiles. (N’hésitez pas à aller voir la documentation de map si vous ne comprenez pas ce que font certaines instructions) Les prochaines questions concernent le code suivant : class Person { public: Person(const std::string& name) : _name{new std::string{name}} {} ~Person() { delete _name; } std::string* _name; }; class Dog { public: Person(const std::string& name, Person& human) : _name{new std::string{name}} , _owner{human} , _owner_name{human.name} {} std::string _name; Person& _owner std:string* _owner_name }; int main() { auto jean = Person { "Jean" }; auto attila = Dog { "Attila", jean }; auto people = std::vector<Person*> { &jean, new Person { "Pierre" } }; return 0; } 8. Qui own jean ? 9. Qui own attila ? 10. Qui own attila.owner ? 11. Qui own attila._name ? 12. Pensez-vous que jean._name est un pointeur ownant? Justifiez. 13. Pensez-vous que attila._owner_name est un pointeur ownant? Justifiez. 14. Pensez-vous que les pointeurs dans people sont ownants ou observants ? Justifiez. 15. Quel problème associé à la mémoire peut-on relever dans ce code ? Combien de temps avez-vous mis à compléter ce chapitre ? Avez-vous des questions suite à sa lecture ? Avez-vous des commentaires concernant le chapitre et/ou le site ?