< 返回版块

files-systems 发表于 2021-03-11 16:16

    let mut s = String::from("hello world");
    s = String::from("hello china");

s被重新赋值后,原先分配的地址被摧毁,然后重新分配地址?

评论区

写评论
作者 files-systems 2021-03-12 17:20

感谢你的回答

--
👇
IWANABETHATGUY: 直接说答案是的。

#![feature(vec_into_raw_parts)]
use rand::Rng;
use std::{io::Read, option::Option::Some};

fn main() -> Result<(), std::io::Error> {
    let mut s = String::from("hello world");
    let (ptr, _, _) = s.into_raw_parts();
    println!("{:p}", ptr);
    s = String::from("hello china");
    let (ptr, _, _) = s.into_raw_parts();
    println!("{:p}", ptr);
    Ok(())
}

两次打印的地址不一样。

IWANABETHATGUY 2021-03-11 21:36

直接说答案是的。

#![feature(vec_into_raw_parts)]
use rand::Rng;
use std::{io::Read, option::Option::Some};

fn main() -> Result<(), std::io::Error> {
    let mut s = String::from("hello world");
    let (ptr, _, _) = s.into_raw_parts();
    println!("{:p}", ptr);
    s = String::from("hello china");
    let (ptr, _, _) = s.into_raw_parts();
    println!("{:p}", ptr);
    Ok(())
}

两次打印的地址不一样。

cutepig123 2021-03-11 21:24

應該不會 估計跟C語言一樣

作者 files-systems 2021-03-11 16:22

不可变引用从声明到使用,这个区间被锁死,不能有可变引用,是不是因为可变引用会改变ptr,以及摧毁原来指向的数据,生成新的ptr,造成原来的ptr失效。

1 共 4 条评论, 1 页