Pourquoi `myvector.push_back (autoPtr.release ())` fournir la garantie de sécurité solide d'exception?

StackOverflow https://stackoverflow.com/questions/3432609

Question

EDIT: Je l'ai mentionné, je regardais le

Était-ce utile?

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 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
}

(à partir du ptr_sequence_adapter.hpp tête )

Ainsi, la fonction 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.

La surcharge de 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() );
}

Le pointeur est libéré avant que l'appel à la 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 > cassera. Vous pouvez avoir des pointeurs vers auto_ptrs, et stocker les auto_ptrs ailleurs, mais auto_ptr sémantique de copie ne fonctionne pas jive avec des conteneurs STL, qui reposent sur la copie.

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