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!
第三、避免越界访问!