C++ 指针与内存模型入门

1 min read [C/C++零基础到大神] post #cpp#pointer#memory

指针保存的是对象地址。

int x = 42;
int* p = &x;

&x 取得地址,*p 解引用指针。

空指针

现代 C++ 使用 nullptr

int* p = nullptr;

使用指针前要确认它指向有效对象。

常见错误

建议

能用引用就不要用裸指针。需要表达所有权时优先使用智能指针。

内存条示意 图片来源:Wikimedia Commons,内存模块照片,用来辅助理解“对象位于内存中”这个事实。

指针真正难在哪里

指针难的地方不是 *& 的语法,而是生命周期。一个地址在某个时刻有效,不代表它永远有效。对象销毁后,原来的地址可能还保留在指针变量里,但它已经不再指向一个合法对象。

比如函数返回局部数组地址就是典型错误:

int* bad() {
    int data[4] = {1, 2, 3, 4};
    return data;
}

data 在函数返回后生命周期结束,返回的指针没有意义。

调试建议

遇到指针问题时,不要只看变量值。要同时看三件事:指针本身是不是空、它指向的对象是否还活着、访问的范围是否越界。很多野指针 bug 都是这三件事里的某一件被忽略了。

评论

...

正在读取评论。