[英]How exactly do stack vs. heap allocation work in Rust?
因此,我了解这种工作方式的简单答案是,本地内容发生在堆栈中,而盒子内容发生在堆中。
但是,当您有更复杂的行为时会发生什么?
具体来说,让我们来谈谈在FFI中保存的数据不确定的时间,然后在以后从* mut c_void恢复。
如果您“忘记”一个指针,则使用std :: mem :: forget或std :: mem :: transmute()指向* const指针的指针,结果的持久性如何?
如果(例如)在函数内部完成,然后函数返回,堆栈是否被清除并且内存变为无效?
通常来说,分配给堆的“盒子”指针在被销毁之前是有效的(例如,使用read())吗?
有人在IRC上告诉我,这通常是采取的正确方法:
unsafe fn fp(v:Box<Foo>) -> *const c_void {
return transmute(foo);
}
但是,从libcore :: raw :: Box来看,Box与* const T远不相同; 真的可以吗?
如果您“忘记”一个指针,则使用std :: mem :: forget或std :: mem :: transmute()指向* const指针的指针,结果的持久性如何?
如果通过fp
函数使用Transmute转换了Box
,则指针将一直保持有效,只要transmute
正在使用该值,并且释放内存的析构函数将不会运行。 (至少在将其转换回Box<...>
以使析构函数运行并释放内存之前,它是有效的。)
forget
没有返回值,它只是丢弃该值而无需运行析构函数。
但是请注意,以嬗变*const c_void
需要格外小心,如Foo
内 Box<Foo>
可能包含线程本地数据,或者引用,因此可能是无效的线程之间传递,或长生不老。 (意味着指针本身可以永远存在/可以使用,但是您喜欢,但是它指向的数据可能无法使用。)
如果开始转换&
指针,则需要非常小心生命周期,不要让它们脱离它们所指向的数据范围(例如,不能从函数返回指向局部变量的指针)。
如果(例如)在函数内部完成,然后函数返回,堆栈是否被清除并且内存变为无效?
堆栈不会被“清除”(即未显式清零),但是将任何指针用于不再存在的堆栈帧是无效的。
通常来说,分配给堆的“盒子”指针在被销毁之前是有效的(例如,使用read())吗?
你需要更具体, ptr::read
不能在被称为Box
直接,并呼吁ptr::read
上一个*const c_void
肯定不会做任何有用的。
但是,从libcore :: raw :: Box来看,Box与* const T远不相同; 真的可以吗?
raw::Box
根本不是普通Box
的表示形式。 raw::Box
是旧@
(现在为Gc
)类型的表示。 Box<T>
实际上是*mut T
的包装 。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.