J'ai une classe fourni à partir d'une bibliothèque comme ceci:coulée entre deux classes de type-basé sur un modèle utilisant des pointeurs Partagés
template <typename T>
class TypedClass
{
public:
typedef typename boost::shared_ptr<TypedClass<T> > Ptr;
T m_data;
T* m_pointer_data;
};
En supposant que je suis prêt à accepter que int et float sont toujours la même taille (et l'alignement) sur cette architecture particulière, cela me semble valable:
TypedClass<int>* int_object = new TypedClass<int>();
TypedClass<float>* float_object = reinterpret_cast<TypedClass<float>* >(int_object);
maintenant, je suis en train de réaliser la même chose en utilisant shared_ptrs boost et je suis venu à ceci:
TypedClass<int>::Ptr int_object = TypedClass<int>::Ptr(new TypedClass<int>());
void* int_object_void_pointer = reinterpret_cast<void*>(int_object.get());
TypedClass<float>::Ptr float_object(reinterpret_cast<TypedClass<float>*>(int_object_void_pointer));
Ce qui semble fonctionner très bien, mais cette utilisation de pointeurs partagés fera l'objet à supprimer deux fois que je voudrais éviter. Il est important de noter que 'TypedClass' fait partie d'une bibliothèque tierce et que cette bibliothèque utilise des pointeurs partagés pour toutes ses fonctionnalités internes. J'ai donc besoin des données dans ce formulaire. J'ai déjà résolu ce problème en héritant de boost enable_shared_from_this, mais ce n'est pas possible ici.
Il s'agit d'une technique simple permettant de réutiliser le même objet pour des types de données de même taille sans avoir à allouer un nouvel objet au nouveau type.
Suggestions bienvenues.
Je crois qu'il y a un problème que vous obtiendrez deux pointeurs partagés indépendants sur la même mémoire. Si le nombre de références d'une instance tombe à zéro, le pointeur est supprimé alors que l'autre reste valide, mais pointe toujours vers des données non définies. – Erbureth
"En supposant que je suis prêt à accepter que int et float sont toujours de la même taille sur cette architecture particulière" également le même alignement? Même si vous êtes assuré par votre compilateur (pour votre architecture) que le cast 'reinterpret_cast *> (int_object);' et les opérations sur le résultat produiront un comportement attendu, vous produisez toujours UB comme Erbureth le signale (votre objet sera supprimé deux fois, une fois par chaque ptr partagé "int_obj" et "float_obj"). –
dyp
J'ai résolu ce problème par le passé en héritant du boost enable_shared_from_this, mais comme c'est une bibliothèque tierce qui n'est pas vraiment une option ici. Je ne connais pas d'autre moyen de le faire. (Mise à jour de la question avec cette information). – Dan