spa*_*rkr 1 pointers go dangling-pointer
我一直在阅读Rust和Go并且我看到这些语言如何处理悬空指针及其引起的问题的细微差别.例如,这是Rust中的一个版本:
fn main() {
let reference_to_nothing = dangle();
}
fn dangle() -> &String {
let s = String::from("hello");
&s
}
Run Code Online (Sandbox Code Playgroud)
上面会错误地说,在函数中dangle,s超出范围,我不能返回它的引用!但在Go中,这似乎有点允许吗?
Go中如何处理这样的事情?在Go中创建悬空指针是否容易?如果是这样,我有什么措施来控制它们?
ber*_*eal 13
在Go中,由于逃逸分析的工作方式,悬空指针不是一个东西.假设你有这样的代码:
func CreateUser(name string) *User {
return &User{Name: name}
}
Run Code Online (Sandbox Code Playgroud)
编译器将理解,因为在函数退出后可以访问指针,所以应该在堆上分配结构.正如Effective Go所说:
请注意,与C不同,返回局部变量的地址是完全可以的.与函数关联的存储在函数返回后仍然存在.
| 归档时间: |
|
| 查看次数: |
509 次 |
| 最近记录: |