【问题标题】:Will this be out of scope and not function properly?这会超出范围并且无法正常运行吗?
【发布时间】:2009-04-22 01:20:38
【问题描述】:

我在我的代码中声明了一个结构,然后尝试将它插入到我编写的数据结构中。但是,我担心由于我在函数内部声明了结构,一旦函数结束,数据结构将指向垃圾。有人可以帮忙吗?

代码如下:

 void Class::function()
 {
  // do some stuff
  node newNode;
  newNode.memAddr = tempNode.memAddr+totalSize;
  newNode.size = tempNode.size-totalSize;
  lists[newNode.size>=512?64:(newNode.size>>3)].insert(&newNode);
 }

编辑:我实际上是在尝试重写 malloc,所以调用 malloc() 或 new 在这里不起作用。有没有什么办法可以把这段代码移到插入方法中,然后让它以一种不会超出插入范围的方式工作?

【问题讨论】:

    标签: c++ struct scope


    【解决方案1】:

    函数返回后会超出范围,是的。那是无效的。您想在堆上分配它。

    编辑:除非你复制你在插入中指向的内存,当然。

    【讨论】:

    • 你应该这么说很有趣,因为我实际上是在尝试重写 malloc... :)
    【解决方案2】:

    这几乎肯定会导致错误。问题是您将堆栈上的值的地址传递给将超出该值的列表。如果列表存储node* 类型,那么这将是不正确的。

    要使其正常工作,您需要执行以下操作之一

    1. 让列表实例存储节点值而不是node*
    2. 在将node* 传入之前,在堆上分配它。这意味着您必须稍后释放它。

    【讨论】:

    • 除非 Node 真的很小,否则你可能不想使用选项 #1。
    • @Steve,根据有限的样本,情况似乎如此。看起来是两个值,一个是指针,一个可能是 size_t。这足够小,可以按价值使用。
    【解决方案3】:

    newNode 将超出范围,其地址将指向垃圾(如 jfclavette 所述。)

    但是,如果有机会

     lists[newNode.size>=512?64:(newNode.size>>3)].insert(&newNode)
    

    被实现为复制 newNode,那么根据您发布的有限的sn-p代码,该副本中的数据可能没问题。

    【讨论】:

      【解决方案4】:

      回答编辑:不。

      【讨论】:

        【解决方案5】:

        正如其他人所指出的,这将导致存储一个指向堆栈的指针。堆栈非常繁忙,它很可能会很快指向您会非常关心的事情,因此您会在运行时很快发现问题。

        最好在堆上分配它(使用new)并在其他时间释放它。

        编辑:删除了“您的编译器应该警告您获取堆栈分配对象 (&newNode) 的地址。”如果您尝试返回对堆栈对象的引用,您的编译器会警告您,但如果您只是尝试获取指针,则不会。

        【讨论】:

        • 获取堆栈对象的地址绝对没有错,他的编译器不会警告他。唯一有效的警告是他是否返回了堆栈变量的地址。
        • 我认为我没有看到编译器对此发出警告。有很多情况下它很好(例如 scanf 和同期群),所以我想如果他们这样做会很烦人。
        【解决方案6】:

        您为什么要尝试实现 malloc?除非您正在编写操作系统,否则您可能不想这样做。最终,您需要调用 malloc 为您执行的操作系统的堆函数。如果您只想更好地控制事物的分配方式,请查看placement new

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-03-02
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-09-24
          相关资源
          最近更新 更多