Disons que je donne les résultats suivants:Quand une fonction membre est-elle hors de portée?
struct Foo
{
Foo() : bar([&]{ doSomething();})
std::function<void(void)> bar;
void doSomething(){};
}
Et permet de dire un fil appelle en permanence l'élément de barre d'une instance Foo alors qu'un autre thread destructs l'instance Foo. Est-il possible qu'un appel à la barre entraîne un appel de fonction invalide puisque le destructeur de Foo est appelé en premier? Est-ce que le destructeur de Foo invalide les appels de fonction membres avant la désallocation?
Editer: Désolé, j'aurais dû être un peu plus spécifique, est-ce que l'appel de doSomething devient indéfini avant que le destructeur de barre ne soit appelé?
Les variables membres existent dans les objets. S'il n'y a pas d'objet, comment la variable membre peut-elle exister? –
Il est de votre responsabilité de vous assurer qu'aucun fil ne détruit un objet alors qu'un autre fil l'utilise ou pourrait l'utiliser. –
C'est d'ailleurs la principale raison pour laquelle un objet ne peut pas synchroniser sa propre destruction. Si vous voulez implémenter des 'demandes de destruction', c'est-à-dire qu'un objet peut être appelé à détruire tout en traitant simultanément d'autres requêtes, ceci doit être synchronisé * extérieurement *, pas par la classe elle-même. – ComicSansMS