2010-02-02 3 views
0

J'ai du code qui crée une file d'attente synchronisée que j'utilise dans une classe de collecte de données pour rapporter ses données. La méthode qui crée des files d'attente est kicking un avertissement:Est-ce que cela rapporte vraiment un addess local?

Queue^% DataGatherer::AddOutputQueue() 
{ 
    Queue^ outputQueue = Queue::Synchronized(gcnew Queue); 
    AddOutputQueue(outputQueue); 
    return outputQueue; 
} 

1> \ DataGatherer.cpp (21):. C4172 avertissement: adresse de retour de la variable locale ou temporaire

Est-ce une avertissement je devrais être inquiet ou suis-je en sécurité dans ce cas et c'est juste le compilateur se confondre Queue::Synchronized renvoyant un Queue^? Le code semble fonctionner correctement, mais les avertissements me rendent nerveux ;-)

Répondre

0

Queue^% indique qu'un handle est passé par référence. Cependant, le handle à l'intérieur du func est une variable locale qui ne peut pas être passée par référence car elle est potentiellement détruite quand la fonction se termine. Retirez le % du type de retour et vous allez bien.

Modifier: Cela ne veut rien dire que votre code semble fonctionner. Il peut arrêter de le faire d'une minute à l'autre.

+0

Une idée de comment je peux obtenir la fonction pour renvoyer une référence que la classe DataGatherer et l'appelant peuvent utiliser? Je suis d'accord sur le fait que cela pourrait ne pas toujours fonctionner; c'était la raison principale pour laquelle j'ai posé la question :-) –

+0

Pour retourner une référence, vous devez créer l'objet référencé sur le tas plutôt que sur la pile. Je ne vois pas pourquoi vous devriez faire cela, mais dans votre code, Queue^est une poignée qui, en quelque sorte, est une référence. – user231967

+0

Corrigez-moi si je me trompe mais ce n'est pas ce que fait 'gcnew Queue'? AFAIU le bit syncronisé encapsule juste la classe sous-jacente pour le rendre threadsafe. Au moins, c'était mon intention ... –

Questions connexes