rust 的文章在 认识所有权
这三个写在一起吧
4.1 什么是所有权
用c++ 的 unique_ptr 来理解就好了
4.2 引用与借用
用c++ 的 unique_ptr& 来理解就好了,但是别指望c++的编译能帮你检查。
4.3 切片 Slice 类型
这玩意让我们脑洞大开上想想,rust在 slice 指向的 数据不存在之后,编译期就能给出报错。
假设是在版本是c++14。 因为c++上没有,而如果要自己实现
1.1. 只能用unique_ptr
1.2. 内存只能一份
1.3. 获取到的slice,在array不存在的时候,不能使用。这玩意就标准库的情况下是就算是在运行期也是做不到的,因为在c++里引用也是可以保存的。运行期都不知道怎么检查。c++17之后有string_view , c++20 有 span
内存只有一份 是可以做到的。
但是对于获取到的span,它只能在运行期去检查.
综上所述:编译期肯定做不到,运行期,呵呵呵,也做不到。
附:
- rust 的报错示例
let s = String::from("abcdefghijklmn");
let x = &s[2..3];
s.clear();
println!("Hello, world!{}",x); //这里编译会报错
- 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 就是那个内存已经被释放了。但是还是指向那个内存。并且能读。
- 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}}