ポインタメンバー変数をnullptrに初期化する必要がありますか?

3575 ワード

今日のブログは皆さんと一つの問題を討論して、一緒に勉強して進歩しました.
前のブログでは、さまざまなコードセグメントを使用して、さまざまな状況でのメモリ漏洩を実証しました.
今日実际の工事の中でまた指针のもたらす误りに出会って、分君は分かち合います.
説明:クラス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にメモリを割り当てる前にnullptrにaを割り当てる簡単な解決策があります.
初期化リストを使用して、関数を構築するときに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");
}