Move

2 文章

移动、复制和 clone

4 分钟

C 程序员看赋值和传参,第一反应通常是“复制一份值”:

uint32_t a = 10;
uint32_t b = a;

结构体也可以按值复制:

struct Point p1 = {1, 2};
struct Point p2 = p1;

但一旦结构体里有指针,事情就变复杂:

struct Buffer {
    uint8_t *data;
    size_t len;
};

struct Buffer b2 = b1; // 只是复制指针和长度

这不是深拷贝。b1.data 和 b2.data 指向同一块内存。谁释放?能不能同时改?释放一个以后另一个还能不能用?C 里这些问题靠约定处理。

阅读更多

所有权:谁拥有,谁释放

4 分钟

C 代码里早就有所有权。

只要一段内存需要 free,一个文件需要 fclose,一个句柄需要释放,就一定存在一个问题:谁负责最后把它释放掉。

C 的问题不是没有所有权,而是所有权通常不在类型里。它靠函数名、注释、调用约定和团队经验维护。Rust 的 ownership 做的事,就是把这些约定变成编译器能检查的规则。

阅读更多