【问题标题】:Are Pointers stable?指针稳定吗?
【发布时间】:2012-04-07 02:34:48
【问题描述】:

我想使用对象的实际指针地址(未标记为 volatile)来唯一标识该对象。

这是一件坏事吗?一般来说,系统内存管理会移动对象,因此它的地址是关于还是指针是稳定的?

谢谢

【问题讨论】:

  • 在您的术语含义内,指针是稳定的。在 C 中,重新分配会使指针无效。每当您的代码移出范围时,都会使指针无效。但如果指针保持在作用域内,它们就足够稳定了。

标签: c++ objective-c c pointers


【解决方案1】:

你的指针保证在它指向的对象的生命周期内保持稳定,除非你做一些事情来破坏它。操作系统确实会在内存中移动东西,但那是物理内存 - 操作系统提供给您的进程的虚拟内存空间会将东西保持在相同的地址。

【讨论】:

  • 指针在它指向的对象的生命周期内保持有效,而不是(必然)在程序的生命周期内。
  • 非常正确,但 OP 询问的是“稳定性”,即对象是否可以移动到不同的地址。 “破坏它的东西”将包括释放()或以其他方式破坏对象。尽管如此,这是我将添加到我的答案中的重要一点。感谢您的关注。
  • 你可以有一个指向本地对象的指针。在范围结束时,对象不会移动,它(逻辑上)不再存在,并且指针变得无效。 gist.github.com/2324873
【解决方案2】:

在 C 中,对象的地址在其生命周期内是恒定的。请注意,根据 C 标准,realloc 不会“移动”对象;它分配一个内容相同的新对象(新旧长度中较短的那个),如果成功,则释放旧对象。

【讨论】:

    【解决方案3】:

    指针是稳定的,但是,您应该正确使用指针,否则您的代码将不稳定。

    指针在对象死亡之前一直有效,一旦对象死亡,您将拥有所谓的Dangling Pointer

    有很多方法可以避免悬空指针,其中一些是非常高级的主题。例如,您可以使用“句柄”,但这是一种更复杂的方法,并且需要与默认不同的内存管理。

    您使用的语言对于指针失效的方式也很重要。你的问题被标记为 C、C++ 和 Objective-C。在 C 中,您的指针可以通过 malloc 和 realloc 无效,而在 C++ 中,您的指针可以通过 delete 无效。

    如果您是第一次被介绍,我强烈建议您阅读更多关于指针的内容,例如 this article

    我还建议阅读更多内容到std::shared_ptr

    【讨论】:

    【解决方案4】:

    iOS 内存管理不会移动对象。如果你有一个指向对象的指针,它在对象的生命周期内都是有效的。

    在您的问题中,您指的是“指针地址”。但是,我假设您的意思是指向该对象的指针。否则这个问题的答案会变得更复杂。

    【讨论】:

      【解决方案5】:

      指向对象的指针在对象死亡(稳定)之前一直有效。

      使用指针进行识别有其用途,但可能不是最好的做法。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-03-07
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多