指针变量未初始化导致程序崩溃

问题描述: 在功能自测的时候发生程序崩溃,在调试的过程将问题定位到崩溃是在操作指针的地方。代码示例如下:

if (ptr != nullptr)
{
	delete ptr;
	ptr = nullptr;
}

崩溃在ptr = nullptr;这一行代码上,而我前面定义了该指针int* ptr;并未对其进行new相关的操作和初始化,那既然ptr并不是nullptr,那为何delete该指针后会导致程序崩溃呢?

原因分析: delete指针操作只是释放指针原本所指的内存,并没有删除该指针,如果该指针没有进行new相关的操作和初始化,也就是没有进行申请内存的操作,且指针指向了一个随机值,因此ptr 不是 nullptr,如果执行delete操作会导致程序崩溃。

思维拓展: 如果不进行delete ptr; ptr = nullptr;这两行代码操作程序会崩溃吗?在VC++中,程序在Release模式下输出000000000000000A,而在Debug模式下输出CCCCCCCCCCCCCCCC,说明未初始化的指针指向的是一个随机的地址,在未初始化下对指针执行写操作,也有可能会使程序崩溃,比如指向随机的地址恰好有内容,就会把之前的内容给覆盖掉,也会引起系统崩溃。

解决方案: 没有进行new操作,就不要进行delete操作。其次指针一定要进行初始化,将指针初始化为某个变量的地址,或者初始化为空指针,如下:

int temp =10;
int* ptr = &temp;  //将指针初始化为temp变量的地址

int *ptr = nullptr;  //初始化为空指针

如果是对new出来动态内存的指针进行初始化呢?如下:

 int* p1 = new int;  //指向了一个未被初始化的int空间
 int* p2 = new int();  //指向了一个被初始化的int空间,其值为0
 int* p3 = new int(1);  //指向了一个被初始化的int空间,其值为1
 // define class A;
 A* p4   = new A;  //指向了一个调用了默认构造函数的实例A,除非A的默认构造函数对A的成员进行初始化,否则A的成员全为未初始化变量
 A* p5   = new A(); //指向了一个调用了默认构造函数的实例A,若A自定义了默认构造函数,A的成员变量初始化依赖于自定义的默认构造函数,反之A的成员变量全为初始化后的变量
 A* p6   = new A[10]; //指向了一个调用调用了默认构造函数的实例A的数组,执行结果同p4
 A* p7   = new A[10](); //指向了一个调用调用了默认构造函数的实例A的数组,执行结果同p5

在平时写代码的过程中,对于一块新申请的内存需要先进行初始化再去用它,一般是例如p3的直接初始化或者用memset函数。不同new的用法对应的初始化的逻辑总结如下:

new Anew A()new A(parameters)
A为内置类型无初始化动作进行值初始化,若Aint类型,则初始化为0进行值初始化,A被初始化为parameters
Acalss/struct调用默认构造函数,A中成员是否初始化依赖于默认构造函数的实现。若自定义了默认构造函数,则调用自定义的默认构造函数。否则调用系统默认构造函数,并对A中的成员进行值初始化。调用A的自定义构造函数
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值