平顶山建设银行网站,qq是哪个公司旗下的游戏,如何在京东上开网店,汕头网站模板价格一、野指针
① 什么是野指针#xff1f;
野指针指向一个已删除的对象或未申请访问受限内存区域的指针。与空指针不同#xff0c;野指针无法通过简单地判断是否为NULL避免#xff0c;而只能通过养成良好的编程习惯来尽力减少#xff0c;对野指针进行操作很容易造成程序错误…一、野指针
① 什么是野指针
野指针指向一个已删除的对象或未申请访问受限内存区域的指针。与空指针不同野指针无法通过简单地判断是否为NULL避免而只能通过养成良好的编程习惯来尽力减少对野指针进行操作很容易造成程序错误。
② 成因
野指针主要是因为这些疏忽而出现的删除或申请访问受限内存区域的指针 指针变量未初始化任何指针变量刚被创建时不会自动成为 NULL 指针它的缺省值是随机的它会乱指一气因此指针变量在创建的同时应当被初始化要么将指针设置为 NULL要么让它指向合法的内存 指针释放之后未置空有时指针在 free 或 delete 后未赋值 NULL便会使人以为是合法的别看 free 和 delete 的名字尤其是 delete它们只是把指针所指的内存给释放掉但并没有把指针本身干掉此时指针指向的就是“垃圾”内存释放后的指针应立即将指针置为 NULL防止产生“野指针” 指针操作超越变量作用域不要返回指向栈内存的指针或引用因为栈内存在函数结束时会被释放。示例程序如下
class A {
public:void Func(void) { cout “Func of class A” endl; }
};
class B {
public:A *p;void Test(void) {A a;p a; // 注意 a 的生命期 只在这个函数Test中而不是整个class B}void Test1() {p-Func(); // p 是“野指针”}
};函数 Test1 在执行语句 p-Func() 时p 的值还是 a 的地址对象 a 的内容已经被清除因此 p 就成了“野指针” 。
② 规避
初始化时置 NULL指针变量一定要初始化为 NULL因为任何指针变量除了 static 修饰的指针变量刚被创建时不会自动成为 NULL 指针它的缺省值是随机的。释放时置 NULL当指针 p 指向的内存空间释放时没有设置指针 p 的值为 NULLdelete 和 free 只是把内存空间释放了但是并没有将指针 p 的值赋为 NULL通常判断一个指针是否合法都是使用 if 语句测试该指针是否为 NULL。例如
int *pnewint(6);
delete p;
// 应加入 pNULL; 以防出错
// ...
if(p ! NULL) {*p7;cout p endl;
}对于使用 free 的情况常常定义一个宏或者函数 xfree 来代替 free 置空指针
#define xfree(x) free(x); x NULL;
// 在 C 中应使用 nullptr 指代空指针
// 一些平台上的 C/C 已经预先添加了 xfree 拓展如 GNU 的 libiberty
xfree(p);
// 用函数实现例如 GitHub 上的 AOSC-Dev/Anthon-Starter #9
static inline void *Xfree(void *ptr) {free(ptr);
#ifdef __cplusplusreturn nullptr;
#elsereturn NULL;
#endif
}
qXfree(q);因此动态分配内存后如果使用完这个动态分配的内存空间后必须习惯性地使用 delete 操作符取释放它。
二、悬空指针
在 C/C 等语言中悬空指针Dangling Pointer指的是一个指针的指向对象已被删除那么就成了悬空指针。野指针是那些未初始化的指针。
int main(){
char*dp NULL;
for(i0;i1;i) {
char c;dp c;
}
/* 注意c的声明周期 */
/* dp 此时为悬空指针 */
}
// for循环只是说明c是局部变量
void f() {
char*dp;
/* dp 未初始化是野指针 */
}null 与空串的区别 null 不占用空间空字符串占用一定内存空间 null 可以赋值给任何对象而空字条串只能赋值给 String 调用 null 的方法会返回 nullpointerexception调用空字符串的方法不会报错 null 本身就是个对象但它是一个不确定的对象只能给引用形变量赋值不能给基本类型赋值如 int anull;是错误的。