C++ 指针与内存模型入门
指针保存的是对象地址。
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 都是这三件事里的某一件被忽略了。
评论
...正在读取评论。