Qt中的野指针

crk_13在刚学Qt的时候没弄清的一个东西

如果我在头文件中定义了这样一个类:

class DialogWindow:public QDialog
{
public:
    DialogWindow();
    ~DialogWindow();

private:
    QpushButton *pushButton;//假设我们在这个定义了一个QpushButton类的指针
}

crk_13以前一直以为它会指向NULL。

结果其实不是,它指向一个垃圾地址,而并非NULL。

我们一般可能会在它对应源文件的构造函数中这样做:

DialogWindow::DialogWindow
{
    pushButton = new QpushButton(this);//为pushButton申请资源,要是没有这一步,到下一行时会异常终止
    pushButton->setText("OK");//显然,后面我们就可以对它进行操作了
}
没有第3行的话,pushButton就是个典型的野指针,因为我们在使用它之前没有为他分配内存空间。


我发现有时候我们可能希望pushButton能在没有身亲资源或者资源被释放后能指向NULL(不同于野指针),这样我们可能可以根据这个判断做出相应的执行


if(pushButton == NULL)
{
    pushButton = new QpushButton(this);
}
pushButton->setText("OK");
这时候,我们就可能要用到NULL了!怎样才能使pushButton在没有资源的时候指向NULL呢?


两个地方需要注意:

1、就是构造函数了;因为在类的定义里面是不能对成员进行初始化的,我们只能在构造函数中让它指向NULL;

2、析构函数;我们在释放资源之后,pushButton并不会乖乖的指向NULL,实际上,他会指向原来那个地方(现在已经被释放了),要是你再调用的话,程序会异常终止的!那我想要它指向NULL怎么办呢?可以这样:在他的析构函数里

DialogWindow::~DialogWindow
{
    delete pushButton
    pushButton = NULL;//这样就又指向NULL了!
}
简单吧!可以拿来做判断了!

其实我上面不是很规范,没关系,大家懂这个意思就行了!2:14了,晚安!


贴上野指针产生的几个原因:

        第一、我们定义了一个指针,却没有让他指向一个有效的地址(或者分配一块内存空间),也就是没有初始化!

        第二、指针所指向的内存空间被释放(free/delete)后,没有指向NULL,他就会指向一个不存在的地址。

        第三、指针操作超出了变量作用范围,也就是越界了。例:

int arr[10];
int *p = arr;
int i = 0;
for(i = 0; i < 11; i++)
{
    printf("%d\t", *p);
    p++;
}
显然,在第14轮循环中,指针p超出了数组arr的边界,指向了arr[9]后面那个地址,这是危险的,程序中要避免出现!

综上,在实际编程中,我们应该相应的注意这三点:

        第一、养成定义了指针立即将其初始化的好习惯。即使不初始化,也最好将其指向NULL,这样至少可以判断出来!

        第二、不使用(资源被释放)了的指针最好将其指向NULL!

        第三、避免越界访问!

你可能感兴趣的:(异常,内存,野指针)