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

今天的博客是与大家一起讨论一个问题,共同学习进步。

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

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

描述:
有一个类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

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");
}

你可能感兴趣的:(C++)