C++ 指针值无效
C++ Invalid pointer values
>我想知道哪些指针值无效,这样我就不必仅仅为了标记特殊的块状态而分配新内存(内存消耗至关重要)。所以我可以将它们用于特殊状态,例如
- 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 以使向后兼容变得容易 - 但这并不能保证)。
它是唯一的"特殊"指针值。 所有其他值都被视为有效的指针值(这意味着尝试使用它们将尝试取消引用指针 - 并且可能会对 0x00000001
或 0x00000002
等值产生不良后果)。 听起来你需要一个具有状态的容器(例如池)(可以是enum
或你想要的其他值)。 或者,您可以使用 boost::optional<T>
或 std::pair<T*, bool>
将指针标记为有效或无效。
相关文章:
- 如何实现容纳整数和无效指针的双向链表?
- 在基数排序中,我得到 munmap_chunk():无效指针和中止(核心转储).为什么?
- 应用地址清理器后,免费无效指针消失
- C++ 在具有数组成员的类上无效指针/双精度释放
- 不断得到分段错误和free()无效指针
- 使用无效指针初始化指针声明符的行为是否未定义?
- 结构作为参数的函数产生错误:free():无效指针:0x00007efd47b
- 无效指针、隔离标识符等
- c++ 无效指针从空闲列表中取消排队
- C++ munmap_chunk(): 无效指针:
- 为什么我的简单C++程序使用队列和 fstream 错误到无效指针
- 无效指针和非初始化的指针之间的差异
- 如何用无效指针初始化unique_ptr的向量
- 地址清理器在静态强制转换无效指针时报告错误
- MS4:Free(Free()无效指针0xB74E74E0 ***
- ***检测到的GLIBC *** MS2:free():无效指针:0xB7526FF4 ***
- 无效指针功能的输出
- 有人能告诉我这是如何在main()中实现的吗?(关于无效指针的问题)
- C++11使用智能指针,但得到无效指针
- 无效指针的相关性