(如有错误,请联系我更正,以免误导他人!)
新手必看,大神绕道勿喷。谢谢!
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>
对于新手来说,编译器不报错,但是运行出错,这是最尴尬的事情了。野指针的使用就很有可能出现这种情况。掌握上面的指针使用姿势,妈妈再也不怕我被野指针虐了