web-dev-qa-db-fra.com

pointeurs et tableaux intelligents

Comment les pointeurs intelligents gèrent-ils les tableaux? Par exemple,

void function(void)
{
    std::unique_ptr<int> my_array(new int[5]);
}

Quand my_array sort du champ d'application et est détruit, le tableau entier entier est-il à nouveau revendiqué? Seul le premier élément du tableau est-il récupéré? Ou y a-t-il autre chose (comme un comportement indéfini)?

43
helloworld922

Il appellera delete[] et donc la totalité du tableau sera récupérée, mais je pense que vous devez indiquer que vous utilisez une forme de tableau de unique_ptrpar:

std::unique_ptr<int[]> my_array(new int[5]);

C'est ce qu'on appelle spécialisation partielle du unique_ptr.

74
Alok Save

Edit: Cette réponse était fausse, comme expliqué par les commentaires ci-dessous. Voici ce que j'ai dit à l'origine:

Je ne pense pas que std :: unique_ptr sait appeler delete []. Il a effectivement un int * en tant que membre - lorsque vous supprimez un int * cela va supprimer le tableau entier, donc dans ce cas, tout va bien.

Le seul but de la suppression [] par opposition à une suppression normale est qu'elle appelle les destructeurs de chaque élément du tableau. Pour les types primitifs, cela n'a pas d'importance.

Je le laisse ici parce que j'ai appris quelque chose - j'espère que d'autres le feront aussi.

3
Nathan Monteleone