2010-10-03 6 views
1

Pouvez-vous me dire quel est le problème avec ce morceau de code? J'ai demandé cela dans une interview et je ne suis pas sûr de ce qui ne va pasDifférence entre le pointeur et le pointeur intelligent

tClass est une classe de test avec une méthode printSomething qui imprime des membres de tClass.

tClass * A = new tClass(); 
f(A); 
A->printSomething(); 

auto_ptr<tClass> * B = new tClass(); 
f(B); 
B-> printSomething(); 

ou ce que c'est une question piège.

+3

Cela peut sembler stupide: quelle est la fonction f()? – beta0x64

+1

Pour ajouter à ChrisW, 'f' n'accepte probablement pas un argument' auto_ptr' et 'auto_ptr' ne convertit pas en pointeur natif, vous avez donc besoin de' f (B.get()) '. – Potatoswatter

+1

que se passe-t-il si f est 'modèle void f (T ptr) {ptr-> printSomething(); } '? – SingleNegationElimination

Répondre

6

auto_ptr est un type de pointeur intelligent qui fonctionne sous le principe selon lequel exactement une partie propriétaire du pointeur, et si ce possédante la partie est hors de portée, le pointeur est supprimé. Lorsque vous passez un auto_ptr à une fonction, vous donnez la fonction "ce pointeur", et vous ne l'avez plus. quand vous le dérérez, vous obtenez un comportement de pointeur nul (qui n'est pas défini, bien sûr).

Afin d'obtenir votre code pour compiler, cependant, vous devez changer votre définition de B un peu, il devrait être

auto_ptr<tClass> B = new tClass; 

depuis auto_ptr n'est pas un type (c'est un modèle de type), et vous ne voulez pas du tout un pointeur vers ce type, car la classe surcharge ces comportements.

+1

Peut-être que vous voulez mentionner que 'auto_ptr' est déprécié en faveur de' unique_ptr': http://stackoverflow.com/questions/2404115/is-auto-ptr-deprecated. Aussi, la paire de parenthèses est-elle vraiment nécessaire après 'tClass'? – Arun

+1

@ArunSaha: ce n'est pas encore obsolète *. C++ 0x n'est pas encore standard :) – jalf

+1

"Lorsque vous passez un auto_ptr à une fonction ..." uniquement true pour le passage par valeur; f() peut accepter une référence à auto_ptr. –

3

choses mal avec elle:

  • A est jamais supprimée.
  • f n'est pas déclaré.
  • B devrait probablement être de type auto_ptr<tClass>.
  • new tClass() est de type tClass* qui n'est pas le bon type d'attribuer à B.
Questions connexes