2015-10-29 1 views
-1

J'essaie de lancer un vecteur à void* et vice versa. La classe est glm::vec3.static_cast de et vers void * ne fonctionne pas comme prévu

Qu'est-ce que je fais est:

glm::vec3 a = glm::vec3(10,10,10); 
void* b = static_cast<void*>(&a); 
glm::vec3 new_a = *static_cast<glm::vec3*>(b); 

Maintenant, si je fais ces opérations dans la même portée, pas de problème, a et new_a sont les mêmes. Mais si j'enregistrer le void* dans, par exemple, un attribut de classe, puis que vous essayez de le convertir en vec3 dans une autre fonction, la conversion de glm::vec3 en void* est maintenant erronée et a!=new_a.

Avez-vous une idée pourquoi cela se produit? Pourrait-il être lié à la portée de glm::vec3?

+0

* "Cela peut-il être lié à la portée de glm :: vec3?" * Oui –

+1

Pouvez-vous essayer de créer un [Exemple minimal, complet et vérifiable] (http://stackoverflow.com/help/mcve) et nous montrer? –

+0

Vous semblez essayer de stocker un pointeur sur une variable locale. –

Répondre

1

Il est fort probable que votre a soit hors de portée. Prenons l'exemple suivant:

class A 
{ 
    void foo() 
    { 
     glm::vec3 a = glm::vec3(10,10,10); 
     _ptr = static_cast<void*>(&a); 
    } 

    void * _ptr; 
} 

Ici, nous prenons l'adresse de a, le jeter aux void* et stocker dans un champ de classe. Jusqu'ici tout va bien. Cependant, a est une variable locale de foo(), ce qui signifie que lorsque foo() quitte, a sera supprimé et _ptr deviendra un pointeur suspendu.