这是否超出范围而且功能不正常?

时间:2009-04-22 01:20:38

标签: c++ struct scope

我在代码中声明了一个结构,然后尝试将其插入到我编写的数据结构中。但是,我担心因为我在函数内部声明了struct,所以一旦函数结束,数据结构将指向garbage。任何人都可以帮忙吗?

以下是代码:

 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将不起作用。是否有某种方法可以将此代码移动到插入方法中,然后使其工作方式不会超出插入范围?

6 个答案:

答案 0 :(得分:3)

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

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

答案 1 :(得分:1)

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

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

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

答案 2 :(得分:1)

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

但是,如果有机会的话

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

实施为复制 newNode,然后根据您发布的有限代码片段,该副本中的数据可能就行了。

答案 3 :(得分:0)

正如其他人所说,这将导致存储指针指向堆栈。堆栈非常繁忙,它很可能会很快指向你会非常关心的东西,所以你会在运行时很快找到问题。

最好将它分配到堆上(使用new)并在另一时间解除分配。

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

答案 4 :(得分:0)

回答编辑:否。

答案 5 :(得分:0)

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