|  |  |  | @ -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如何做到这一点呢? | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | 在正式进入主题前,先来一个预热知识。 | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
	
		
			
				
					|  |  |  | 
 |