我在代码中声明了一个结构,然后尝试将其插入到我编写的数据结构中。但是,我担心因为我在函数内部声明了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将不起作用。是否有某种方法可以将此代码移动到插入方法中,然后使其工作方式不会超出插入范围?
答案 0 :(得分:3)
函数返回后它将超出范围,是的。那是无效的。您想在堆上分配它。
编辑:当然,除非你复制你在插入中指向的内存。
答案 1 :(得分:1)
这几乎肯定会导致错误。问题是,您将地址传递给堆栈上的值到超出值的列表。如果列表存储node*
类型,那么这将是不正确的。
要使其正常工作,您需要执行以下操作之一
node*
。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。