C++指针使用与特殊指针杂谈
指针使用
- 指针创建时要初始化,如 int *p = NULL;
- 使用指针时,注意指针所指向的内存是否被分配成功,并且指向的内存是否被初始化。如
要注意分配后的大小,不要越界。int *p = (int *)malloc(sizeof(int)); if(p != NULL){ //... }
- void* 类型的指针(无类型指针),其实这种形式只是记录了一个地址。使用时要强制转换为指定类型。
当使用
void*
指针时,由于不知道所指向数据的类型,所以不能进行解引用和指针的算术运算,因为不知道解引用不知道获取多少字节的数据,运算时不知道跨度多大;解引用需要强制转换指针类型,如
int main(){ void *p; int n = 100; p = &n; cout<<*(int*)p; // p强制转为int*类型指针后再解引用 }
- 两个指针最好不要指向同一块内存,一个指针的释放(free或delete)会导致另外一个指针成为悬垂指针,造成不堪设想的后果;
- 释放指针内存后要将该指针置空;
野指针、悬垂(悬空)指针
野指针和悬垂指针都是指向无效内存地址的指针,但它们的产生原因和性质有所不同。
悬垂指针是【已经释放的内存地址】的指针。在程序释放了一块内存之后,如果仍然存在指向该内存地址的指针,则该指针称为悬垂指针。使用悬垂指针可能会导致不可预测的行为,因为程序无法确定该内存是否已被重新分配给其他变量或对象。
野指针是指向【未知或未分配的内存地址】的指针。
通常,野指针是由于以下情况引起的:
- 指针未初始化,即在使用前没有将指针初始化为有效地址;
- 指针被释放,但在释放后仍被使用;
- 指针指向已经释放的内存区域;
- 指针越界访问了数组或缓冲区。
因此,悬垂指针是一种特定类型的野指针,它们指向已经被释放的内存地址。虽然野指针可能包含悬垂指针,但它们也可能指向未分配的内存区域,指针越界访问等其他情况,这些情况不属于悬垂指针的范畴。
空指针
空指针是一个具有特殊值(通常为0)的指针,它指向一个无效的地址。在C和C++语言中,可以使用字面值0或NULL或nullptr(在C++语言中)来表示空指针。
空指针不指向任何有效的内存地址,因此对其进行解引用或者访问指向的对象都会产生错误
const与指针
声明一个指针时,若const在*
左侧,即 const *
则表示指针指向的内容是不可更改的;
反之,若 const 在*
右侧,即 * const
,则表示指针不能更改为指向其它内容;
另外,若 *
左右各有一个const,则表示指针指向的内容不可更改,指针本身也不可更改为指向其它内容;
int n=100;
int const *p = &n;
*p = 9; // 试图通过p更改n,错误
int n1=1, n2=2;
int * const p = &n1;
p = &n2; // 试图更改p指向其它内容,错误
int n1=1, n2=2;
int const * const p = &n1; //不能通过p修改n1,也不能更改p指向其它内容
智能指针
智能指针,本质上是对资源所有权和生命周期管理的抽象:
当资源是被独占时,使用 std::unique_ptr 对资源进行管理。
当资源会被共享时,使用 std::shared_ptr 对资源进行管理。
使用 std::weak_ptr 作为 std::shared_ptr 管理对象的观察者。
通过继承 std::enable_shared_from_this 来获取 this 的 std::shared_ptr 对象
本文来自博客园,作者:aJream,转载请记得标明出处:https://www.cnblogs.com/ajream/articles/17295872.html
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· winform 绘制太阳,地球,月球 运作规律
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人