了解指针转换

时间:2016-05-27 19:23:04

标签: c++ pointers casting pool

我正在读这篇有趣的文章。 http://www.codeproject.com/Articles/746630/O-Object-Pool-in-Cplusplus

我无法理解这一行_firstDeleted = *((T **)_firstDeleted);

_firstDeleted已有T*类型。任何人都可以解释该声明的目的吗?

2 个答案:

答案 0 :(得分:4)

当一个对象被销毁时,它的第一个sizeof(T*)字节将被下一个自由对象的地址覆盖。
(也就是说,*T实际上不再存储T而是T*,如果你看到我的意思。演员表演这种重新解释。这在形式上是相当不确定的。)

这具有删除的对象形成可用存储块的链表的效果。

重用此列表的对象内存意味着您不需要单独的空闲块列表。

答案 1 :(得分:2)

*((T **)content) = _firstDeleted;这样的代码被称为“引用类型惩罚指针”,即打破严格的别名规则,即未定义的行为。作者试图做的是_firstDeleted指向未初始化的内存中的第一个“自由”对象,其中包含所有未定义的行为优点。

Modern C ++(尽管该文章于2014年发布)可能会使用更安全的设备进行未初始化的存储,例如the C++ standard library