您的位置:首页 > 其它

指针成员变量需要初始化为nullptr吗?

2016-07-14 22:28 411 查看
今天的博客是与大家一起讨论一个问题,共同学习进步。

上一篇博客用了很多代码段,演示了各种的情况下的内存泄露。

今天在实际工程中又遇到了指针带来的错误,分君分享。

描述:

有一个类A:

class A
{
public:
A(){}
~A(){}
void show(){std::cout << "show" << std::endl;}
}


有一个类B:

class B
{
public:
B();
~B();
public:
void start();
private:
A * a;
}

B::B()
{

}

B::~B()
{
if(a)
{
delete a;
a = nullptr;
}
}

B::start()
{
a = new a();
}


就是上面的代码,被我简化了,一句话概括就是,在B类中使用了A类的指针对象作为的成员变量。

感觉没啥问题吗?

该有的析构函数都有啊。。。

但是问题来了,如果 start()函数没执行怎么办?

你可能会这样认为,如果start()没执行,也就没有给指针a分配内存,所以a为空,当然就不会执行delete a操作了。

但是实际情况不是你想象的这个样子的,我们不能保证a = nullptr,也许是一个垃圾值。

那么,有一个简单的解决方法,就是在给a分配内存之前,先把a赋值为nullptr。

使用初始化列表

在构造函数的时候对a进行赋值:

B::B() : a(nullptr)
{

}


接下来是一个大神对我的指点:

在if中不要直接判断a

因为a可以是0,NULL, nullptr,只有C++11才支持nullptr。

而且上面的写法对于平台的移植很不方便。

应改为:

B::~B()
{
if(a != nullptr)
{
delete a;
a = nullptr;
}
}


最后与君分享:

#include<iostream>

class Test
{
public:
Test() {}
~Test() {}

public:
void Show()
{
std::cout << "show" << std::endl;
}
};

int main()
{
Test* test;
std::cout << test; //错误了,VS会告诉你使用了未初始化的变量
test = nullptr;
test = new Test();
test->Show();

if (test != nullptr)
{
delete test;
test = nullptr;
}

system("pause");
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: