Il n'est pas "magique" afin de détecter si un int*
désigne:
- un seul segment de mémoire allouée entier
- un segment de mémoire allouée tableau
- un entier dans un segment de mémoire allouée tableau
L'information a été perdue par le système de type et de n d'exécution de la méthode (portable) peut fixer. C'est rageant et un grave défaut de conception (*) dans le C que le C++ hérité (pour des raisons de compatibilité, certains disent).
Cependant, il y sont des manières de faire face avec des tableaux de pointeurs intelligents.
Tout d'abord, votre unique_ptr
type est incorrect de traiter avec un tableau, vous devez utiliser:
std::unique_ptr<int[]> p(new int[10]);
qui est censé appeler delete[]
. Je sais qu'il y est question de la mise en œuvre d'un avertissement spécifique dans Clang pour attraper évidente inadéquation avec unique_ptr
: c'est une qualité de mise en œuvre de la question (de la Standard simplement dit que c'est UB), et tous les cas ne peuvent être couverts sans WPA.
Deuxièmement, une boost::shared_ptr
peut avoir un personnalisé deleter, qui pourrait, si vous le concevez pour appeler le bon delete[]
de l'opérateur. Cependant, il y a un boost::shared_array
spécialement conçu pour cela. Une fois de plus, la détection de l'inadéquation est une qualité de mise en œuvre de problème. std::shared_ptr
souffre du même problème (édité après ildjarn la remarque).
Je suis d'accord que c'est pas joli. Il semble tellement odieux qu'un défaut de conception ( * ), depuis les origines de la C nous hante encore aujourd'hui.
(*) certains diront que C penche fortement en faveur d'éviter la surcharge et cela aurait ajouté un rétroprojecteur. J'ai en partie d'accord: malloc
toujours de connaître la taille du bloc, après tout.