Je suis tombé sur un étrange segfault. La cause m'a conduit en fait à un bug, mais je ne comprends toujours pas pourquoi une erreur de segmentation est causée ici ... Le code est:Strange segfault avec unique_ptr et shared_ptr
#include <memory>
int main(int argc, char **arv)
{
int *i = new int;
std::unique_ptr<int> u1(i);
std::unique_ptr<int> u2;
u1 = std::move(u2); // line 7
std::shared_ptr<int> s1(i); // line 8
std::shared_ptr<int> s2;
s2 = s1;
}
Je compilez avec g ++ 4.6 et -std=c++0x
et obtenir un segfault.
Si je change la ligne 7 à u2 = std::move(u1);
(c'était le bogue) il disparaît. Si je change la ligne 8 en std::shared_ptr<int> s1(new int(3));
(ce que bien sûr je ne veux pas) elle disparaît aussi. Si je supprime de la ligne 8 également aucun segfault.
Donc, pas de mal fait, mais je ne comprends pas pourquoi il devrait y avoir un segfault. Pour autant que je comprends,
dans la ligne 7 un pointeur vide est assigné à u1. Pas de réinitialisation(), pas de fin de portée. Néanmoins i
semble être invalide à partir de là. Est-ce intentionné? Cela signifie qu'il faut être très très prudent lorsque vous déplacez un pointeur car un autre objet pourrait être détruit!
Qu'en pensez-vous? Comment puis-je me protéger de cela?
Merci, Steffen
ce qui me dérange, c'est que je peux le faire sans même un avertissement lors de la compilation avec '-pedantic -Wall -Wextra'. La réponse est-elle vraiment juste "Ne pas!"? – steffen
@steffen: En effet, la réponse est "Do not". Il n'y a pas de protection contre 'int * p = new int; do_crazy_stuff (p); be_insane (p); take_ownership (p); Le compilateur ne peut pas vraiment savoir ce que vous allez faire avec le pointeur. –
Vrai ... merci pour la dé-illusion :) – steffen