为什么你的C++程序总崩溃?可能是这4种野指针在作祟

第一章:为什么你的C++程序总崩溃?可能是这4种野指针在作祟

在C++开发中,指针是强大而危险的工具。一旦使用不当,极易引发程序崩溃、内存泄漏甚至安全漏洞。其中,野指针——即指向已释放或未初始化内存的指针——是导致段错误(Segmentation Fault)的常见元凶。以下四种典型场景尤其值得警惕。

未初始化的指针

声明指针后未赋初值,其值为随机地址。解引用将导致不可预测行为。
// 错误示例:使用未初始化的指针
int* ptr;
*ptr = 10; // 危险!ptr指向未知位置
正确做法是初始化为 nullptr 或合法地址。

指向已释放内存的指针

释放堆内存后未置空,后续误用将访问非法区域。
// 错误示例:使用已delete的指针
int* ptr = new int(5);
delete ptr;
*ptr = 10; // 崩溃!内存已释放
建议在 delete 后立即将指针设为 nullptr。

返回局部变量地址

函数返回局部变量的地址,调用方获取的是栈上已失效的内存引用。
// 错误示例:返回局部变量指针
int* getPtr() {
    int value = 42;
    return &value; // 危险!函数结束后value被销毁
}
应改用动态分配或返回值传递。

多个指针共享同一内存管理权

多个指针指向同一块堆内存,若一个指针释放后其他指针未同步更新,形成悬挂指针。 为避免上述问题,推荐使用智能指针替代裸指针。以下是常见野指针场景对比:
场景风险解决方案
未初始化随机地址访问初始化为 nullptr
释放后未置空访问已释放内存delete 后赋值为 nullptr
返回局部地址栈内存失效避免返回局部变量地址
多指针共享悬挂指针使用 std::shared_ptr

第二章:悬空指针——内存释放后的隐秘陷阱

2.1 悬空指针的形成机制与常见场景

悬空指针的基本定义
悬空指针(Dangling Pointer)是指指向已释放或无效内存地址的指针。当程序试图通过该指针访问内存时,可能引发未定义行为。
典型形成场景
  • 释放堆内存后未置空指针
  • 返回局部变量地址
  • 对象析构后仍保留引用
代码示例与分析

int* ptr = (int*)malloc(sizeof(int));
*ptr = 10;
free(ptr);        // 内存已释放
ptr = NULL;       // 防止悬空
上述代码中,free(ptr) 后若未将 ptr 置为 NULL,则其变为悬空指针。后续误用将导致程序崩溃或数据损坏。
规避策略
建议在释放内存后立即赋值为 NULL,并通过条件判断避免非法访问。

2.2 动态内存释放后指针未置空的典型错误

在C/C++开发中,动态分配的内存释放后若未将指针置空,极易引发野指针问题。此时指针仍指向已释放的内存地址,后续误用将导致程序崩溃或不可预测行为。
常见错误示例

int *p = (int *)malloc(sizeof(int));
*p = 10;
free(p);        // 内存已释放
// 缺少:p = NULL;
printf("%d", *p); // 危险!访问已释放内存
上述代码中,free(p) 后未将 p 置为 NULL,后续解引用可能访问非法地址。
安全实践建议
  • 释放内存后立即赋值指针为 NULL
  • 使用前始终检查指针有效性
  • 封装释放操作为安全函数,如:safe_free(void **pp)
通过统一管理指针生命周期,可显著降低此类内存错误的发生概率。

2.3 使用智能指针避免悬空的经典实践

在现代C++开发中,智能指针是管理动态内存的核心工具,能有效防止悬空指针问题。
常见智能指针类型对比
  • std::unique_ptr:独占所有权,轻量高效,适用于资源唯一归属场景。
  • std::shared_ptr:共享所有权,通过引用计数管理生命周期。
  • std::weak_ptr:配合 shared_ptr 使用,打破循环引用,避免内存泄漏。
典型使用示例

#include <memory>
#include <iostream>

void example() {
    auto ptr = std::make_shared<int>(42);
    std::weak_ptr<int> weakRef = ptr;

    if (auto locked = weakRef.lock()) {
        std::cout << *locked << std::endl; // 安全访问
    }
}
上述代码中,weak_ptr 用于临时访问共享对象,lock() 方法返回 shared_ptr,确保对象未被释放,从而避免悬空指针访问。

2.4 调试工具检测悬空指针的有效方法

在C/C++开发中,悬空指针是引发程序崩溃和内存错误的常见原因。现代调试工具通过运行时监控与静态分析结合的方式,有效识别潜在的悬空指针问题。
使用AddressSanitizer检测悬空访问
int* ptr = new int(10);
delete ptr;
*ptr = 11; // 悬空指针写入
AddressSanitizer在释放内存后将其标记为“红区”,后续访问会触发运行时报错,精确捕获非法操作。
主流工具对比
工具检测方式适用平台
Valgrind动态二进制插桩Linux, macOS
ASan编译时插桩跨平台
UBSan未定义行为检查Clang/GCC
结合编译器警告(如-Wuse-after-free)与上述工具,可大幅提升悬空指针的检出率。

2.5 RAII原则在资源管理中的实战应用

RAII(Resource Acquisition Is Initialization)是C++中管理资源的核心机制,通过对象的构造函数获取资源、析构函数释放资源,确保异常安全与资源不泄漏。
典型应用场景
文件操作、互斥锁和动态内存管理是RAII最常见的使用场景。例如,使用智能指针自动管理堆内存:

std::unique_ptr<int> data(new int(42)); // 构造时分配
// 无需手动delete,离开作用域自动释放
该代码利用unique_ptr在栈对象析构时自动调用删除器,避免内存泄漏。
自定义资源封装
可将RAII扩展至自定义资源。如封装一个文件句柄:

class FileHandle {
    FILE* f;
public:
    explicit FileHandle(const char* name) {
        f = fopen(name, "r");
        if (!f) throw std::runtime_error("无法打开文件");
    }
    ~FileHandle() { if (f) fclose(f); }
    FILE* get() const { return f; }
};
构造函数负责初始化,析构函数确保关闭文件,即使发生异常也能正确释放资源。

第三章:未初始化指针——指向未知区域的危险箭头

3.1 野指针的根源:声明即使用的风险剖析

在C/C++开发中,野指针是悬空引用的一种典型表现,其根本原因常源于“声明即使用”的编程习惯。变量声明后未初始化便直接解引用,将指向随机内存地址,引发不可预知行为。
常见成因分析
  • 指针声明后未赋初值
  • 释放内存后未置空指针
  • 栈对象销毁后指针仍保留
代码示例与风险演示

int* ptr;        // 未初始化
*ptr = 10;       // 危险:写入未知地址
上述代码中,ptr未初始化即被解引用,导致程序可能崩溃或触发安全漏洞。操作系统无法保证该地址可写,极易引发段错误(Segmentation Fault)。
防御策略
声明时立即初始化为 nullptr 可有效规避此类问题:

int* ptr = nullptr;
// 使用前检查
if (ptr) *ptr = 10;

3.2 全局与局部指针初始化的最佳实践

在C/C++开发中,指针的正确初始化是避免空指针解引用和内存泄漏的关键。全局指针应在定义时显式初始化为 nullptr,以确保程序启动时的安全性。
全局指针的推荐初始化方式
int* global_ptr = nullptr;

int main() {
    // 使用前再分配内存
    global_ptr = new int(42);
    return 0;
}
该方式确保在 main() 执行前指针处于安全状态,防止未定义行为。
局部指针的初始化策略
  • 优先使用栈对象或智能指针替代裸指针
  • 若必须使用,应在声明时立即初始化
void func() {
    int value = 10;
    int* local_ptr = &value;  // 避免悬空指针
}
此做法保证局部指针始终指向有效内存,提升代码健壮性。

3.3 利用编译器警告发现未初始化隐患

编译器不仅是代码翻译工具,更是静态分析的第一道防线。启用高级警告选项可有效识别潜在的未初始化变量使用问题。
启用关键编译器警告
以 GCC 为例,推荐开启以下标志:
gcc -Wall -Wextra -Wuninitialized -Wmaybe-uninitialized -O2 source.c
其中 -Wuninitialized 结合 -O2 可触发数据流分析,检测局部变量在使用前是否已赋值。
典型问题示例
int main() {
    int value;
    printf("%d\n", value); // 使用未初始化变量
    return 0;
}
上述代码在启用相应警告后会触发 warning: 'value' is used uninitialized,提示开发者修复。
跨平台兼容性建议
  • Clang 同样支持 -Wuninitialized
  • MSVC 应启用 /Wall 并关注 C4700 警告
  • 持续集成中应配置编译器警告为错误(-Werror)

第四章:越界访问引发的指针失控

4.1 数组与容器遍历时的指针边界陷阱

在遍历数组或容器时,指针越界是引发程序崩溃的常见原因。尤其在C/C++中,手动管理内存使得边界检查尤为关键。
典型越界场景
  • 循环条件误用 <= 导致访问末尾后一个元素
  • 反向遍历时未正确判断下限,如从 size() 开始而非 size() - 1
  • 迭代器失效后仍被解引用
代码示例与分析

int arr[5] = {1, 2, 3, 4, 5};
for (int i = 0; i <= 5; ++i) {  // 错误:i=5 越界
    std::cout << arr[i] << " ";
}
上述代码中,数组长度为5,合法索引为0~4。但循环条件为i <= 5,当i=5时访问arr[5],属于未定义行为,极易导致段错误。
安全实践建议
使用标准库容器(如std::vector)配合范围for循环或迭代器可有效规避此类问题。

4.2 迭代器失效与指针等价性的深度辨析

在C++标准库中,迭代器常被视为泛化的指针,但二者在语义和行为上存在本质差异。理解迭代器失效机制是避免未定义行为的关键。
迭代器失效的常见场景
当容器内部结构发生改变时,原有迭代器可能失效。例如,在std::vector中插入元素可能导致内存重分配,使所有迭代器失效。

std::vector vec = {1, 2, 3};
auto it = vec.begin();
vec.push_back(4); // it 现在已失效
*it; // 未定义行为
上述代码中,push_back触发扩容,原it指向的内存已被释放。
指针与迭代器的等价性分析
虽然指针满足随机访问迭代器的所有要求,但并非所有迭代器都具备指针的稳定性。下表对比关键特性:
特性原生指针STL迭代器
失效风险低(手动管理)高(依赖容器)
算术运算支持依类别支持

4.3 安全封装与范围检查的防御性编程技巧

在构建高可靠性系统时,安全封装与范围检查是防御性编程的核心手段。通过隐藏内部状态并对外暴露受控接口,可有效防止非法数据状态。
封装敏感数据
使用访问控制限制直接操作内部字段,确保所有修改经过校验逻辑:

type Temperature struct {
    value float64
}

func (t *Temperature) SetValue(v float64) error {
    if v < -273.15 {
        return errors.New("温度不可低于绝对零度")
    }
    t.value = v
    return nil
}
该实现通过私有字段 value 阻止外部直接赋值,SetValue 方法强制执行物理边界检查。
输入范围验证策略
  • 对所有外部输入执行前置校验
  • 使用白名单机制限制可接受值域
  • 在边界处抛出明确错误而非静默修正

4.4 STL算法中指针使用的正确范式

在STL算法中,指针常作为迭代器的底层实现机制。使用原生指针时,需确保其指向有效内存范围,避免未定义行为。
指针作为随机访问迭代器
int arr[] = {1, 2, 3, 4, 5};
std::sort(arr, arr + 5); // 指针充当随机访问迭代器
此处 arr 和 arr + 5 是合法指针,符合STL算法对迭代器区间的要求:左闭右开。
常见错误与规避策略
  • 避免传递空指针或悬垂指针
  • 确保指针所指对象生命周期覆盖算法执行期
  • 优先使用容器的 begin() 和 end() 而非手动计算指针
正确使用指针能提升性能,但必须遵循STL的迭代器契约,保证区间有效性与可解引用性。

第五章:总结与防范野指针的现代C++之道

智能指针替代原始指针
在现代C++中,优先使用 std::unique_ptr 和 std::shared_ptr 可有效避免资源泄漏和野指针问题。例如:
// 使用 unique_ptr 管理动态对象
std::unique_ptr<int> ptr = std::make_unique<int>(42);
// 对象自动释放,无需手动 delete
RAII 机制确保资源安全
资源获取即初始化(RAII)是C++的核心理念。通过构造函数获取资源,析构函数释放资源,确保异常安全。
  • 避免裸 new 和 delete
  • 使用容器如 std::vector 替代动态数组
  • 自定义类应遵循 RAII 原则
静态分析工具辅助检测
集成 Clang-Tidy 或 AddressSanitizer 可在开发阶段捕获潜在的指针错误。例如,在编译时启用检查:
g++ -fsanitize=address -g -O1 main.cpp -o main
该命令启用 AddressSanitizer,运行时可检测悬空指针访问、越界等行为。
代码审查中的常见陷阱
陷阱类型示例解决方案
返回局部指针int* f() { int x; return &x; }使用值或智能指针返回
重复释放delete p; delete p;交由智能指针管理
现代C++编码规范建议
流程图示意: [对象创建] → [智能指针接管] ↓ [作用域结束] → [自动析构] ↓ [无野指针风险]
C++指针陷阱:野指针、悬空指针与空指针详解 本文深入探讨C/C++指针中的三大问题:野指针(未初始化指针)、悬空指针(指向已释放内存)和空指针(NULL指针)。野指针因未初始化而指向随机地址,可能导致程序崩溃或安全漏洞;悬空指针在对象释放后仍保留旧地址,易引发Use-After-Free漏洞;空指针解引用直接导致崩溃。文章详细分析各类指针的成因、危害及检测方法,并提出防御措施:初始化指针、释放后置空、使用智能指针(C++)及静态/动态分析工具。通过典型案例展示问题场景与修复方案,强调指针安全对程序稳定性的重要性。 阅读详情

相关推荐

野指针定义以及如何在编程中避免野指针

当你使用free(在C中)或delete(在C++中)释放了指针所指向的内存后,该指针仍然保留原来的内存地址,但此时这个地址已经不再是有效的内存空间了。当函数返回指针时,要确保返回的指针指向的是有效的内存地址,并且在函数返回后该内存地址仍然有效。是一个指针变量,它指向一个已经被释放的内存地址,或者是一个未知的内存地址。在进行类型转换时,要确保转换是安全的,并且转换后的指针指向的是有效的内存地址。总之,避免野指针的关键在于谨慎地管理指针和内存,确保指针始终指向有效的内存地址,并在不再需要时正确地释放内存。

2402_84885073的博客 803

为什么你的结构体指针传参导致程序崩溃?一文揪出4大隐患根源

掌握C语言中结构体指针的函数传递技巧,避免程序崩溃。详解空指针、内存泄漏、别名冲突和对齐问题四大隐患,覆盖常见应用场景与安全传参方法,提升代码稳定性,值得收藏。

VarChat的博客 856

野指针介绍

野指针是指向无效内存位置的指针,可能会引发严重的程序错误。通过正确初始化指针、在释放内存后设置指针为`NULL`、避免返回局部变量的指针等措施,可以有效地避免和处理野指针问题。

m0_47106200的博客 1193

UE4垃圾回收空指针导致的崩溃

定位到大致问题,因为UE4的垃圾回收机制,会回收无用的标记过的无用变量,而判断无用变量的条件根据上述代码所示就是是否为空指针。 分析到这里,就不难发现导致程序崩溃的原因。角色身上未拾取武器时,武器插槽数组中的指针均为nullptr,但是我的想法是一直保留数组中的空指针,因为游戏中玩家可以反复拾取和丢弃武器。但是UE4的GC机制会判断武器插槽中指针为空时,就把内存回收掉了,导致我下一次使用不了该指针变量。

qq_53142455的博客 874

C/C++——野指针处理

在C++中,“野指针”(dangling pointer)指的是指向已释放或无效内存的指针。使用智能指针(如 std::unique_ptr、std::shared_ptr 和 std::weak_ptr)可以自动管理内存,避免野指针的问题。如果后续创建对象或者程序执行结束后,会自动使用构造和析构函数,合理分配和释放指针内存。当释放掉分配的动态内存后,将指针设置为nullptr,防止后续意外再次使用该指针。析构函数:在析构函数中,释放动态分配的内存,并将指针置空。4、避免返回局部变量的地址。

鲸落博客 980

iOS野指针定位总结

野指针就是指向一个已删除的对象或者受限内存区域的指针。 我们写C++的时候强调指针初始化为NULL,强调用完后也为其赋值为NULL,谁分配的谁回收,来避免野指针的问题。 比较常见的就是这个指针指向的内存,在别处被回收了,但是这个指针不知道,依然还指向这块内存。 MRC 时代因为引用计数手动控制,所以内存很容易在别处被回收。ARC解决了大部分这种问题。、 在iOS9之前,系统库的delegate和t...

wangletiancsdn的博客 1196

c++开发中常见的崩溃问题及解决办法

记录了c++在windows和linux环境下开发时常见的崩溃问题及解决方法

qq_37245700的博客 1445

程序化广告行业(23/89):深度剖析广告效果评估指标

大家好,我一直希望能和大家一起在技术领域不断探索、共同进步。在之前的文章中,我们了解了程序化广告中腾讯的业务布局和广告效果评估的基础概念,今天让我们进一步深入剖析广告效果评估的各项指标,这对理解程序化广告的运作机制至关重要

yyy173611的博客 4865

C++悬空指针造成的崩溃问题排查及解决

出现崩溃问题后,使用gdb打印崩溃时的堆栈,发现崩溃在p->func()附近,即在刚进入func()里面崩溃的,那么此时很可能是由于p已经被释放掉了。若在p->func()调用时,p打印出来的值与所析构的对象地址一样,且先析构,后调用的p->func(),为验证或排查此问题,可在p->func()调用之前,将p的值打印出来,然后再将p指向的对象的析构函数处加上打印,打出当前待析构的对象的地址。则说明造成崩溃是由于p已经被释放造成的。

ciengwu的专栏 740

OpenClaw的引导配置(onboard)流程

脚本安装的直接安装完到引导配置界面,其他安装方式还可以直接命令到配置。

supersolon的专栏 1327

ISO15118-20证书结构关系解读(7.3.2.1)

本文主要讲述ISO15118-20:2022标准所有证书结构的关联关系,目的是为后续基于ISO15118-20车桩通讯及PNC充电等提供基础支撑。 本文所有的证书关系图全部来源于ISO15118-20:2022标准规范,在后续的讲解过程会将图的摘取出处给提供出来,便于后期文章和标准对应起来解读。

weixin_40900932的博客 3184

c++对指向NULL的指针进行操作会导致程序崩溃

代码: //文件名称为test.cpp #include <stdio.h> int main(int argc, char* argv[]) { int* ptr = NULL; *ptr = 0; return 0; } 使用指令: g++ test.cpp -o test 运行结果: [root@localhost pcm2g711]# ./test 段错误(吐核) 产生错误的原因是对指向为NULL的指针进行赋值; ...

m0_37876242的博客 1463

在 Windows 上使用 Anaconda 创建 配置 YOLOv8虚拟环境,并更改 pip 源以及以 可编辑模式 安装ultralytics

前往 NVIDIA cuDNN 下载页面,下载与您安装的 CUDA 版本匹配的 cuDNN 版本。:根据您的系统和 CUDA 版本,选择适当的 whl 文件。如下12.7,表示最高可装12.7版本CUDA,与上图中的支持的最高cuda版本一致。,无需重新安装,从而大幅提升开发效率,适用于项目开发、调试或依赖本地未发布的版本时使用,但需确保当前目录包含。:访问 NVIDIA 官方网站,下载与您的显卡和操作系统兼容的 CUDA 版本。首先,确保NVIDIA 显卡支持 CUDA,并安装相应版本的驱动程序。

weixin_44115575的博客 1893

c++野指针小结

1.什么是野指针 所谓野指针(wild pointer),简单讲是指指向不可用的内存区域的指针。需要注意的一点是,野指针与NULL空指针是不同的。NULL指针一般比较好判断,直接用if (p==NULL)语句判断即可。但是野指针指向的是垃圾内存区域的指针,一旦使用往往会造成不可预测的结果,这种随机不可预测的结果才是最可怕的。 2.未初始化 造成野指针最常见的情况之一就是指针未被正确初始化。任何指针在被创建的时候,不会自动变成NULL指针,他的default值是随机的。所以一个比较好的习惯是,指针刚创建的时候

bitcarmanlee的博客 6189

激光雷达与相机融合(四)----基于激光雷达与相机的碰撞检测

在这一部分,基于前面的各个部分内容,将利用激光雷达和相机实现目标的检测分类及单目标跟踪,并对车辆前方的车辆目标计算相应的碰撞时间TTC。计算方法分别利用相机和雷达实现。 1.系统的总体架构: 2.TTC计算 简单介绍一下通过激光雷达和相机计算碰撞时间的原理: 利用激光雷达点计算碰撞时间:首先根据检测框聚类出前车目标的点,并过滤掉这些点中的离群点,然后找出这些点中相对于本车最近的点,基于前后两帧以及数据采集频率就可以求解出相对速度,然后用当前帧的距离除以速度得出当前的TTC。但该方法对最近点的选取稳定性不是

张飞飞的博客 3987

PyRoki 入门教程(二)安装与使用

PyRoki是一个用于机器人运动学优化的Python库,具有模块化设计、可扩展性和跨平台支持等特点。它支持逆运动学、轨迹优化和动作重定位等任务,采用Levenberg-Marquardt优化器提高效率。主要功能包括:基于URDF的可微分正向运动学模型、自动生成碰撞基元、通用成本因子和自定义成本函数等。PyRoki支持CPU、GPU和TPU运行,适用于从单机器人到大规模并行处理场景。目前存在一些限制,如仅支持软约束、静态形状和特定关节类型等。官方提供了多个应用示例,包括基础逆运动学、碰撞检测、轨迹优化和手部/

机器人控制与仿真应用 1252

C++之野指针

一文搞懂C++的野指针是什么,有什么危害,该如何预防。

2301_81280642的博客 1424

WIN10系统下VS2019编译CloudCompare2.12.4

CloudCompare2.12.4

点云侠的博客 3143

【C/C++】野指针概念以及避免方式

野指针指的是未初始化或已经失效的指针变量。

Kitakita的博客 3919

【嵌入式DIY实例ESP32篇】-步数计数器

在本项目中,我们将使用 ESP32 微控制器和博世的 BMI160 加速度计陀螺仪模块构建一款便携式计步器

视觉与物联智能 803

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

【C++】野指针及其危害

【C++】野指针及其危害 引言:小白在初期敲代码时最可能碰到的问题之一估计就是野指针了,因为它在写程序的时候一不注意就写出来了,且不容易被发现,调试半天可能也不会出结果。去找大佬一看,其实就是一个很简单的野指针问题,那么我们今天就来学习一下关于野指针的问题,以及怎么在敲代码时如何规避它。 什么是野指针呢? 答:“野指针”并不是NULL指针,而是在定义上没有初始化,值为随机,又或者是指向了已经被释放...

L19002S的博客 5810

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

野指针的简略讲解

野指针(Wild Pointer)是指向非法内存地址的指针,通常表现为未初始化、指向已释放内存或超出作用域的指针。它并不是NULL指针,而是指向一个不确定的内存地址,可能导致程序崩溃或数据损坏。野指针是指程序员或操作者不能控制的指针。野指针不是NULL指针,而是指向“垃圾”的指针。

2501_90303633的博客 1717

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

野指针崩溃原因

野指针问题可能会立即崩溃也可能不会立即崩溃

佛道教主 2007

C++ 指针与双重指针详解:从底层原理到实战避坑开篇引入:一次由野指针引发的线上崩溃事故

本文深入探讨C++指针的核心概念与应用,重点分析了一例电商平台订单系统崩溃事故的指针问题根源。文章系统讲解了指针的本质、双重指针的三大应用场景(函数参数传递、动态二维数组、链表操作),并总结指针操作的五大常见错误及防御策略(智能指针、内存断点等)。特别指出在AI时代,底层指针操作能力仍具重要价值,尤其在性能优化和嵌入式开发领域。通过代码示例和思考题,帮助读者深入理解指针特性,避免野指针、内存泄漏等典型问题。文章强调,指针作为C++的灵魂,其正确使用是从初级迈向高级开发的关键技能。

2201_76054814的博客 1227

c++空指针和野指针

空指针: 定义:是一个被赋值为NULL的指针,它不指向任何的对象或者函数。 注意事项: 1、使用指针的第一件事就是需要看这个指针是否是空指针(坚决不能使用空指针,否则程序就会崩。意思就是:为一个指针赋值为空指针不会报错,但是在我们想访问的时候会报错(系统不允许我们读取地址为0的数据) 判断空指针的方法:if(p!=NULL){};//NULL是空指针的意思//若明确指针该指针有指向,则不需要做判...

weixin_43914789的博客 1958

关于delete野指针没有崩溃的神奇bug

前言 最近遇到一个神奇的bug:delete野指针没有崩溃。 解决过程 查了很多资料,大致意思是c++没有定义delete野指针的行为,所以delete野指针的行为不可定义,即有可能崩溃也有可能不崩溃。印象比较深刻的一个比喻是:指针指向的内存相当于房间,指针相当于钥匙,当你delete指针就相当于退房,但是由于没有置指针为空(此时该指针就变成野指针),就相当于你还有这个房间的钥匙。但是房东只...

Quellaaa的博客 786
上一篇: async函数用法详解,彻底搞懂C++并发编程核心技巧
下一篇: 掌握这7个配置技巧,让你的Visual Studio轻松驾驭复杂C++工程
PixelFlow
博客等级 码龄1年 180粉丝 2207原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值