Pour reprendre ton code, il permet de briser la raison même d'être de la RAII:
quand tu donnes ton pointeur T*, tu autorises explicitement (pas de const, après tout) l'utilisateur à en faire ce qu'il veut. Il peut le delete, ou plus stupide encore, faire une jolie cochonnerie du genre:
1 2 3 4 5 6 7 8 9 10
|
unique_ptr<int> x(new int(10));
foo_c(x.get());
...
foo_c(int *a)
{
...
a=realloc(malloc(syzeof(int)));
...
} |
La, ton pointeur "intelligent" il possède une adresse mémoire qui a déjà été allouée, et en plus de ça, "a", lui, va causer un memory leak. 2 en 1, c'est jour de promo
Naturellement, on peut estimer que les gens ne sont généralement pas bêtes à ce point, surtout en C ou en C++, quand on voit des pointeurs, on sait qu'on fait mumuse avec un truc qui peut nous péter à la tronche.
Mais il se pourrait aussi que cette fonction foo_c() en réalité très bien conçue pour l'ère du C98 ne soit pas sécurisée en cas de multithread. Ou que le jeu des pointeurs l'invalide pour une raison x ou y.
Si je prend le cas de la SDL, librairie graphique assez connue, il y a une fonction, SDL_BlitSurface qui dans un cas précis, perd le contrôle de sa zone mémoire (avec DirectX 5... mais ce n'est pas l'important).
Partager