rust - 函数调用中的临时对象何时在 Rust 中被删除?
问题描述
Rust 函数调用中临时对象的作用域规则是什么?我真正感兴趣的是以下操作是否安全:
fn foo() -> CString { /* */ }
fn bar(arg: *const libc::c_char) { /* */ }
bar(foo().as_ptr())
我创建了最小的示例,它可以按我的意愿工作——在函数调用返回后删除对象。
struct Bar {
pub x: u32
}
impl Bar {
pub fn new(x: u32) -> Self {
println!("New Bar made!");
Bar { x }
}
pub fn extract(&self) -> u32{
self.x
}
}
impl Drop for Bar {
fn drop(&mut self) {
println!("Bar dropped!");
}
}
pub fn foo(arg: u32) {
println!("Function called with arg = {}", arg);
}
fn main () {
foo(Bar::new(12).extract());
}
我可以依靠这种行为吗?
解决方案
在rust reference中,在“Temporary Lifetimes”下,它说:
...临时值的生命周期通常是
- 最里面的封闭语句;块的尾部表达式被认为是包含该块的语句的一部分,或者
在您的案例中,最里面的封闭语句是对bar( )
. 同一部分中有一些与您的案例非常相似的示例。
如果不是这种情况,编译器就不会编译您的代码。
推荐阅读
- laravel - 在 laravel 护照中创建令牌而不验证身份验证
- google-cloud-platform - 通过 HTTP/2 上的 gRPC 流访问 GCP 机器学习 API 的静态 IP
- django - Django在模板中获取ManyToMany变量
- logstash - logstash 中的标签
- docker - 无法从 Docker Hub 拉取 Docker 中的 Docker 映像
- tfs - 我如何选择最近几天具有特定历史更改的工作项?
- c++ - 使用优先队列使用 Dijkstra 查找所有同样最短的路径
- rust - 将变量传递给函数和生命周期
- python - AWS Redshift - Lambda 中的 get_cluster_credentials
- c++ - ESP-CoAP 服务器调用资源处理程序而不接收包