簡體   English   中英

C ++:我應該將構造函數體中指定的指針成員初始化為NULL嗎?

[英]C++: Should I initialize pointer members that are assigned to in the constructor body to NULL?

假設我有:

// MyClass.h
class MyClass
{
  public:
    MyClass();

  private:
    Something *something_;
}

// MyClass.cpp
MyClass::MyClass()
{
  something_ = new Something();
}

我應該在MyClass構造函數的構造函數初始化列表中初始化something_到NULL(或0)嗎? 或者這是不必要的,因為我在構造函數的主體中分配它? 建議的做法是什么?

通常,您只在初始化列表或正文中分配一次,除非正文初始化可能發生或可能不發生,或者具有先決條件代碼:

MyClass::MyClass() 
{
   //this code must happen first
   // _now_ max is known
   something_ = new Something(max);
}

MyClass::MyClass() 
{
   if (max) 
       something_ = new Something(max);
   else
       something_ = NULL;
}

MyClass::MyClass() 
    : something_(new Something()) 
//as pointed out in the comments, use smart pointers
{
}

一般來說 - 沒有。 但是,如果構造函數指針中的某個位置在初始化之前使用,那么您將獲得未定義的行為。 但是,您遇到的最大問題是 - 如果在構造函數中拋出異常,則不會調用其析構函數。 因此,假設您有兩個指向對象的指針,並且第二個分配失敗時第一個對象的分配成功,在這種情況下,您最終會出現資源泄漏。 這可以通過使用“智能”指針來解決。 但在這種情況下,它們將在初始化列表中初始化,如果您不想為它們分配值兩次,那么您最好在那里而不是在構造函數體中分配內存。

沒有必要,特別是如果你在構造函數體中立即初始化,但是如果初始化不那么明顯那么為什么不使用NULL來避免意外訪問未初始化的變量。

  • 最小的性能開銷
  • 通過瘋狂的bug搜索節省了大量的調試/故障排除時間

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM