|
|
|
@ -21,11 +21,11 @@ int* foo() {
|
|
|
|
|
} // 变量a和c的作用域结束
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
这段代码虽然可以编译通过,但是其实非常糟糕,变量`a`和`c`都是局部变量,函数结束后将局部变量`a`的地址返回,但局部变量`a`存在栈中,在离开作用域后,`a`所申请的栈上内存都会被系统回收,从而造成了`悬空指针(Dangling Pointer)`的问题。这是一个非常典型的内存安全问题, 很多编程语言都存在。
|
|
|
|
|
这段代码虽然可以编译通过,但是其实非常糟糕,变量`a`和`c`都是局部变量,函数结束后将局部变量`a`的地址返回,但局部变量`a`存在栈中,在离开作用域后,`a`所申请的栈上内存都会被系统回收,从而造成了`悬空指针(Dangling Pointer)`的问题。这是一个非常典型的内存安全问题,虽然编译可以通过,但是运行的时候会出现错误, 很多编程语言都存在。
|
|
|
|
|
|
|
|
|
|
再来看变量`c`,`c`的值是常量字符串,存储于常量区,可能这个函数我们只调用了一次,也可能我们不再会使用这个字符串,但`xyz`只有当整个程序结束后系统才能回收这片内存。
|
|
|
|
|
|
|
|
|
|
所以内存安全问题,一直都是程序员非常头疼的问题,好在, 在Rust中这些问题即将成为历史,那Rust如何做到这一点呢?
|
|
|
|
|
所以内存安全问题,一直都是程序员非常头疼的问题,好在, 在Rust中这些问题即将成为历史,因为Rust在编译的时候就可以帮助我们发现内存不安全的问题,那Rust如何做到这一点呢?
|
|
|
|
|
|
|
|
|
|
在正式进入主题前,先来一个预热知识。
|
|
|
|
|
|
|
|
|
|