正确规避野指针姿势

             (如有错误,请联系我更正,以免误导他人!)

新手必看,大神绕道勿喷。谢谢!

break在前几天写代码时,代码在windows上完美运行,但是放到android上运行时发现有内存泄漏,导致闪退。这个错误源于break写代码时不小心使用了野指针。于是写下这篇文章加深印象,以防以后再犯。

 看下面一段代码:

<span style="font-size:18px;">class A {
public:
	void Ddd() { 
	cout << "Ddd" << endl;
	}
};

void main()
{
	A* ptr = new A();
	delete ptr;
	ptr->Ddd();
	system("pause");
}</span>

  (PS:这SB代码是谁写的!弱智么?)

  呵呵,我写的。这段代码编译器绝对不会给你报错,输出如下:

  一个指针,delete之后不能再使用了,否则会出现很多未知的错误。但有的时候我们并不能准确的知道一段内存会在什么时候被delete,也不知道我们什么时候要使用这段内存,这就很尴尬了对不对。

  其实不然,只要掌握正确的指针使用姿势,这都不是难题。为了判断一个指针是否能用我们往往这么写:if(ptr!=nullptr)。这么写是对的,但是只对了一半。因为这里只做了一半的工作。看下面一段代码:

<span style="font-size:18px;">class A {
public:
	void Ddd() { 
	cout << "Ddd" << endl;
	}
};

void func(A* ptr) {
	if (ptr == nullptr) {
		cout << "ptr is null" << endl;
	}
}

void main()
{
	A* ptr = new A();
	delete ptr;
	func(ptr);
	system("pause");
}</span>


  输出如下:

(PS:ptr is null 呢?被你吃了?)抱歉,break并没有吃它

  ptr被delete了之后并不会置空,它还是指向原来那段内存,只是给这段内存标记为“未被占用”。所以(ptr==nullptr)就是false。

  所以正确的姿势是:delete ptr之后马上给ptr置空,然后在使用之前对ptr是否为空做判断。

正确姿势:

<span style="font-size:18px;"><span style="color:#000000;"><strong>class A {
public:
	void Ddd() { 
	cout << "Ddd" << endl;
	}
};

void func(A* ptr) {
	if (ptr == nullptr) {
		cout << "ptr is null" << endl;
	}
}

void main()
{
	A* ptr = new A();
	delete ptr;
	ptr = nullptr;
	func(ptr);
	system("pause");
}</strong></span></span>
  对于新手来说,编译器不报错,但是运行出错,这是最尴尬的事情了。野指针的使用就很有可能出现这种情况。掌握上面的指针使用姿势,妈妈再也不怕我被野指针虐了微笑

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值