29 votes

Quelle est la différence entre new et :: new

De nombreuses bibliothèques comme boost utilisent ::new et ::delete .

Exemple de boost::make_shared

 template< class T, class... Args > typename boost::detail::sp_if_not_array< T >::type make_shared( Args && ... args )
{
    boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ) );

    boost::detail::sp_ms_deleter< T > * pd = static_cast<boost::detail::sp_ms_deleter< T > *>( pt._internal_get_untyped_deleter() );

    void * pv = pd->address();

    ::new( pv ) T( boost::detail::sp_forward<Args>( args )... );
    pd->set_initialized();

    T * pt2 = static_cast< T* >( pv );

    boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );
    return boost::shared_ptr< T >( pt, pt2 );
}
 

Qu'est-ce que ça veut dire? et pourquoi utiliserait-on ::new rapport à un nouveau?

42voto

Basile Starynkevitch Points 67055

Une classe C pourrait définir sa propre operator new (ce qui permet, par exemple, d'avoir votre propre politique d'attribution de cette classe, et/ou pour fournir des Allocateur pour elle. De nombreux conteneurs modèles d'accepter une option allocateur de l'argument, par exemple le deuxième argument std::vector; voir aussi std::allocator et cet exemple).

Si vous le code new C, celle-ci serait utilisée (si elle existe).

Si vous le code ::new Cglobal new est utilisé

Votre exemple est l'utilisation de la mondial de placement new

21voto

Bathsheba Points 23209

new , new[] , delete et delete[] (y compris les variantes de placement) sont remplaçables à la fois à class et à l'échelle mondiale, bien que ce dernier soit mal avisé.

Lorsque vous voyez ::new , vous utilisez l'opérateur global new .

6voto

Sitesh Points 547

En général, chaque fois que l'opérateur de résolution d'étendue ( :: ) est utilisé sans spécificateur au LHS, il fait référence à l'étendue globale. Ici aussi c'est pareil.

Venant à l'opérateur new , il peut être surchargé au niveau local et externe. Par conséquent, pour accéder à l'opérateur de résolution de portée globale de variante est utilisé.

2voto

Yakk Points 31636

new peut être changé et remplacé. Donc, tout simplement en indiquant new n'obtiendrez pas toujours l' new vous le souhaitez.

Dans ce cas précis, nous sommes à la recherche au cours du placement de nouvelles:

void * pv = pd->address();

::new( pv ) T( boost::detail::sp_forward<Args>( args )... );

c'est là que nous essayons de construire un T dans l'emplacement pv.

Pour éviter la possibilité que overrids d' new sont invoqués au lieu de la "vraie" placement new, vous devez utiliser ::new( void pointer here ) type( arguments... );. Que spécifique new peut être ni remplacé ni remplacée.

-1voto

LPTechs Points 1

Le nouvel opérateur normal est implémenté à l'échelle de la classe et peut être remplacé alors que :: new est implémenté à l'échelle globale et ne peut pas être remplacé.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X