Pourquoi `myvector.push_back (autoPtr.release ())` fournir la garantie de sécurité solide d'exception?
-
26-09-2019 - |
Question
EDIT: Je l'ai mentionné, je regardais le
La solution Ceci est précisément une caractéristique de la bibliothèque de conteneurs pointeur Boost. La fonction d'élément de base de (à partir du ptr_sequence_adapter.hpp tête ) Ainsi, la fonction La surcharge de Le pointeur est libéré avant que l'appel à la push_back
est défini comme suit: void push_back( value_type x ) // strong
{
this->enforce_null_policy( x, "Null pointer in 'push_back()'" );
auto_type ptr( x ); // notrow
this->base().push_back( x ); // strong, commit
ptr.release(); // nothrow
}
push_back
lui-même prend possession du pointeur et en cas d'échec réaffectation, il prend la responsabilité de la suppression du pointeur. push_back
qui prend un auto_ptr
est définie en termes de la fonction base de push_back
: template< class U >
void push_back( std::auto_ptr<U> x )
{
push_back( x.release() );
}
push_back
de base, ce qui est bien parce que la fonction de base push_back
a une forte garantie qu'il supprimera le pointeur si une exception est levée.
Autres conseils
Transfert d'un objet sur une presse de auto_ptr que le contrôle de auto_ptr de l'objet. Il ne reçoit plus les avantages du auto_ptr. Vous devez placer l'objet dans un autre pointeur intelligent pour devenir à nouveau en toute sécurité d'exception, ou un objet conteneur qui donne des garanties de sécurité d'exception (s'il y en a?).
S'il vous plaît noter que std :: auto_ptr ne peut pas être utilisé directement dans des conteneurs STL. Par exemple, std :: vector