9
votes

Pourquoi a-t-on besoin d'un NULL Shared_Ptr et comment peut-il être utilisé?

dans Scott Meyers efficace C ++ i>, élément 18 Faire des interfaces faciles à utiliser correctement et difficiles à utiliser de manière incorrecte i>, il a mentionné le null Shared_ptr: xxx pré >

et une opération d'affectation de vogue p> xxx pré>

auquel cas on peut nécessiter de créer un null Shared_ptr et faire une affectation plus tard? Pourquoi ne pas simplement créer le Shared_ptr chaque fois que vous avez les ressources (pointeur brut)? P>

Étant donné que Scott Meyers n'a pas montré l'affectation complète dans l'exemple précédent, je pensais que l'opérateur d'affectation de Shared_Ptr est surchargé que l'on peut le faire. : P>

sptr.cpp: In function ‘int main(int, char**)’:
sptr.cpp:8:39: error: conversion from ‘int*’ to non-scalar type ‘boost::shared_ptr<int>’    requested


2 commentaires

J'ai essayé de comprendre ici: ideone.com/bujowz . Je ne pouvais pas trouver une explication.


Comme d'autres l'ont souligné, il y a beaucoup de raisons pour avoir besoin d'un NULL Shared_Ptr, tout comme vous avez des pointeurs brus nuls. Mais le vrai mystère est pourquoi Scott a senti le besoin de celui-ci d'avoir un Delier personnalisé.


3 Réponses :


22
votes

Il n'est pas nécessaire d'utiliser ce hack pour obtenir un null (vide) partagé_ptr code>. Utilisez simplement le constructeur par défaut: xxx pré>

pour attribuer un pointeur à un partagé_ptr code>, le faire au temps de construction: p>

shared_ptr<Investment> pInv = Investment::create();


7 commentaires

L'exemple GIVIEN dans la doute, la raison du pointeur NULL dans l'appel du constructeur est l'utilisation d'un Delier personnalisé. Le constructeur du pointeur intelligent n'a pas de version qui ne prend que le Delier personnalisé, d'où la nécessité du "hack".


"STD :: Shared_PTR PINT = Nouvel investissement;" ne peut pas être compilé


Oups, on dirait que c'est un constructeur explicite.


Quoi qu'il en soit, parce que lorsque vous réinitialisez le pointeur, le Deleter personnalisé sera également réinitialisé, non? Ensuite, le null Shared_ptr avec un Delier personnalisé n'a aucun sens dans la programmation réelle, alors étrange d'avoir un tel exemple dans un tel livre


Il convient de noter que partagé_ptr n'a été récemment normalisé que récemment, et qu'il ait peut-être une sémantique différente à un autre point dans le processus de normalisation (bien que je doute, il y a un peu de doute ...)


J'ai supposé que j'avais manqué quelque chose, j'ai refusé de croire que Scott pourrait être confondu! Mais c'est la seule explication que je puisse proposer, +1


Remarque Vous pouvez maintenant plus facilement écrire un null partagé_ptr avec un Deleter personnalisé en utilisant std :: Shared_ptr pinv (nullptr, getridofinvestissement) mais je ne sais pas pourquoi vous voudrait.



2
votes

Il y a des tonnes de raisons pour lesquelles vous pourriez aimer des objets de manière à être construite par défaut. Tout d'abord, vous souhaitez que le pointeur intelligent soit aussi semblable possible à un pointeur brut, et puisque vous pouvez dire int * p; (et obtenir un pointeur non défini, non indiqué), vous pouvez aussi Dites partagé_ptr p; et obtenez un pointeur qui ne pointe pas n'importe où (mais vous devez le tester avec ! ).

L'une des raisons les plus impérieuses est peut-être que vous pouvez créer des conteneurs avec partagés_ptr s, et vous pouvez remplir les conteneurs sans affecter des points à jour, puis.


0 commentaires

7
votes

C'est la même raison d'avoir un pointeur brut null - par exemple

dire que vous avez: xxx

ceci vous permet de faire: xxx


0 commentaires