【问题标题】:Does setting a pointer to NULL imply no references to the previous value?将指针设置为 NULL 是否意味着不引用前一个值?
【发布时间】:2013-12-21 17:10:38
【问题描述】:

假设我有一个如下所示的函数:

void fun() {
    struct bintree {
        struct bintree * left;
        struct bintree * right;
    };

    // build a perfectly balanced 7-node bintree
    struct bintree * root = malloc(sizeof(struct bintree));

    root->left = malloc(sizeof(struct bintree));
    root->right = malloc(sizeof(struct bintree));

    root->left->left = malloc(sizeof(struct bintree));
    root->left->right = malloc(sizeof(struct bintree));

    root->right->left = malloc(sizeof(struct bintree));
    root->right->right = malloc(sizeof(struct bintree));

    // create a stack pointer to the left subtree of root
    struct bintree * RL = root->left;

    // remove pointer to root node from stack
    root = NULL;

    // could it be possible to find pointers to root, root->right and
    // its children on the stack/registers? 
}

我的(天真的)假设是,如果我在 fun 返回之前搜索整个堆栈并注册根节点、root->right 及其子节点(在堆上)的地址,我将找不到任何地址。这是一个公平的假设吗?如果是这样,您能想到的任何架构都会有例外吗?怎么会这样?

【问题讨论】:

  • 我知道我会忘记一些事情。
  • 好的。 now 如所写,您至少会编译。您假设以前的地址值不存在于内存或堆栈中的某个位置,这充其量是特定于平台的。从语言纯粹主义者的角度来看,您不需要关心。如所写,您肯定会泄漏内存。运行时库可能会将您的分配分配在某个堆链中,但是一旦您丢失对内存地址的唯一引用,就您的代码而言,它是“无法访问”的。
  • 请记住,C 没有垃圾回收器 - 你忘记了 free rootroot->leftroot->left->leftroot->left->right
  • @Eric 我没有故意释放它们,因为它与问题无关。我可能应该更清楚这一点。

标签: c pointers stack cpu-registers


【解决方案1】:

对于大多数平台和环境,您的假设是错误的。数据值可以保存在某些寄存器或堆栈单元中,即使它们不再来自那些。根据使用的调用约定将正确的值放入寄存器和单元格中并遵守所需的功能是编译器的全部责任,但没有任何其他保证。这就是为什么例如局部变量在函数入口处充满垃圾:它们保留一些以前的值,在某些工作完成后不会被清除。

某些任务需要数据清理(例如,在应用密码内容后删除密码内容),但这是使用显式编码的内存区域清理来完成的。

如果您正在考虑使用垃圾收集的语言,那就是另一个类似的故事了。

【讨论】:

  • 谢谢。这就是我一直在寻找的答案。我实际上是在考虑垃圾收集,但在 C 中。更具体地说,标记扫描算法以及它将如何将对象标记为非空闲,假设它搜索堆栈和寄存器中的指针。但我们不必深究,因为据我所知,提出的问题要复杂得多。
  • @Max 这样的值不太可能长时间保存在寄存器和堆栈中。有所谓的保守垃圾收集器将检查的内存区域中的每个值视为可能的指针。它们在统计上是好的,前提是有人同意由于此类误报而不会收集某些对象,但这是内存中所有对象的百分之几。
猜你喜欢
  • 2014-08-15
  • 2018-11-16
  • 2011-10-16
  • 2010-09-20
  • 2016-09-11
  • 2018-07-25
  • 2023-03-05
  • 1970-01-01
  • 2016-05-24
相关资源
最近更新 更多