指针成员变量需要初始化为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<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");
}
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一苇渡江694

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值