当前位置: 首页>后端>正文

与c++比较学习rust4:认识所有权

rust 的文章在 认识所有权

这三个写在一起吧

4.1 什么是所有权

用c++ 的 unique_ptr 来理解就好了

4.2 引用与借用

用c++ 的 unique_ptr& 来理解就好了,但是别指望c++的编译能帮你检查。

4.3 切片 Slice 类型

这玩意让我们脑洞大开上想想,rust在 slice 指向的 数据不存在之后,编译期就能给出报错。

  1. 假设是在版本是c++14。 因为c++上没有,而如果要自己实现
    1.1. 只能用unique_ptr
    1.2. 内存只能一份
    1.3. 获取到的slice,在array不存在的时候,不能使用。这玩意就标准库的情况下是就算是在运行期也是做不到的,因为在c++里引用也是可以保存的。运行期都不知道怎么检查。

  2. c++17之后有string_view , c++20 有 span
    内存只有一份 是可以做到的。
    但是对于获取到的span,它只能在运行期去检查.

综上所述:编译期肯定做不到,运行期,呵呵呵,也做不到。

附:

  1. rust 的报错示例
    let s = String::from("abcdefghijklmn");
    let x = &s[2..3];
    s.clear();
    println!("Hello, world!{}",x); //这里编译会报错
  1. c++ 保存引用,但数据已经丢失时,继续使用引用,但不报错的例子
class B{
    int bmember ;
    public:
    B():bmember(10){}
    void runbf(){cout << bmember << endl;};
};

class A{
    public:
        unique_ptr<B> b;
};

class C{
    public:
        unique_ptr<B> &b;
        C( unique_ptr<B> &_b):b(_b){}

};
///////////////////////////////////////////
    unique_ptr<C> c = nullptr;
    {
        auto a = make_unique<A>();
        a->b = make_unique<B>();
        c = make_unique<C>(a->b);
    }
    c->b->runbf();  //这里打印出 0  就是那个内存已经被释放了。但是还是指向那个内存。并且能读。


  1. c++使用span,在实例已被删除的情况下,仍然可以修改查看。
    span<int> s;
    {
        vector<int> arr = {1,2,2,3,4};
        s = { arr.begin(),arr.begin()+2 };
    }
    s[0] = 10;
    for(auto x : s){
        cout << x << ",";
    }
    //打印出 10,0 
    //通过debug查看,仍然能看到 s的值为  {static extent = 18446744073709551615, _M_ptr = 0x430070, _M_extent = {_M_extent_value = 2}}


https://www.xamrdz.com/backend/39s1926034.html

相关文章: