【发布时间】:2013-08-31 14:33:23
【问题描述】:
我有一个像这样的库提供的类:
template <typename T>
class TypedClass
{
public:
typedef typename boost::shared_ptr<TypedClass<T> > Ptr;
T m_data;
T* m_pointer_data;
};
假设我愿意接受 int 和 float 在这个特定架构上总是相同的大小(和对齐),这对我来说似乎是有效的:
TypedClass<int>* int_object = new TypedClass<int>();
TypedClass<float>* float_object = reinterpret_cast<TypedClass<float>* >(int_object);
现在我正在尝试使用 boost shared_ptrs 来实现相同的目标,并提出了这个:
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));
这似乎工作正常,但这种共享指针的使用会导致对象被删除两次,这是我想避免的。
重要的是要注意“TypedClass”是第三方库的一部分,并且该库使用共享指针来实现其所有内部功能,因此我需要这种形式的数据。我之前已经解决了这个继承自 boost enable_shared_from_this 的问题,但是这里不可能。
这只是一种简单的技术,它试图为具有相同大小的数据类型重用相同的对象,而不必分配具有新类型的新对象。
欢迎提出建议。
【问题讨论】:
-
我相信有一个问题是你会在同一个内存上获得两个独立的共享指针。如果一个实例的引用计数降至零,则指针将被删除,而另一个仍然有效,但仍指向未定义的数据。
-
“假设我愿意接受 int 和 float 在这个特定架构上的大小始终相同”也是相同的对齐方式?即使您的编译器(对于您的架构)保证演员
reinterpret_cast<TypedClass<float>* >(int_object);和对结果的操作将产生预期的行为,您仍然会产生 UB,正如 Erbureth 指出的那样(您的对象将被删除两次,每个 @ 一次) 987654325@ 和float_obj共享指针)。 -
我过去已经解决了这个问题,继承自 boost enable_shared_from_this 类,但由于这是一个第三方库,所以在这里并不是一个真正的选择。我不知道另一种方法可以做到这一点。 (使用此信息更新了问题)。
-
所以你需要一个
boost::shared_ptr<TypedClass<float> >并且只有一个boost::shared_ptr<TypedClass<int> >并且你不能改变这些要求,因为它们是由第三方库强加的?
标签: c++ casting type-conversion smart-pointers reinterpret-cast