C++ 指针值无效

C++ Invalid pointer values

本文关键字:无效 指针 C++      更新时间:2023-10-16

>我想知道哪些指针值无效,这样我就不必仅仅为了标记特殊的块状态而分配新内存(内存消耗至关重要)。所以我可以将它们用于特殊状态,例如

  • 0x00000000 - 意味着块未加载
  • 0x00000001 - 意味着块是空
  • 0x00000002 - 块已满。当一些真实的东西需要保存到内存中时,我会做新的 Chunk(...

我建议只使用包含指针和枚举的结构。但是,如果由于某种原因不方便,只需分配一些小结构并使用它们的地址来指示魔术指针值。(当然,永远不要释放它们。

您还可以使用静态对象的地址。喜欢这个:

static int chunk_not_loaded_i, chunk_empty_i, chunk_full_i;
void *chunk_not_loaded = &chunk_not_loaded_i;
void *chunk_full = &chunk_full_i;
if (some_chunk == chunk_not_loaded)
    ...

为指针分配精确值非常不稳定且容易出错。这样,您的代码将严格遵循确切的硬件体系结构。例如,某些平台已0x00000000为绝对有效的地址。因此,地址是否分配的事实与指针的数值无关(在常见情况下)。

0x00000000 等效于 NULL ,应该在 C++11 中替换为 nullptr(它没有指定的数值 - 尽管大多数实现将其视为 0 以使向后兼容变得容易 - 但这并不能保证)。

它是唯一的"特殊"指针值。 所有其他值都被视为有效的指针值(这意味着尝试使用它们将尝试取消引用指针 - 并且可能会对 0x000000010x00000002 等值产生不良后果)。 听起来你需要一个具有状态的容器(例如池)(可以是enum或你想要的其他值)。 或者,您可以使用 boost::optional<T>std::pair<T*, bool> 将指针标记为有效或无效。