2012-03-30 3 views
4

対私は一例としてこれを取る、ここでの違いを確認したい:私の例ではコンストラクタは、新しい

class Gate 
{ 
    public: 
      Gate(); //Constructor 
      void some_fun(); 
    private: 
      int one, two; 
      ptr p1; 
      Gate* next; 
}; 
typedef Gate* ptr; 

Gate::Gate() 
{ 
    one = 0; 
    two = 0; 
} 

void Gate::some_fun() 
{ 
    p1 = new Gate; 
    p1 = p1->next; 
    p1 = new Gate(); 
} 

を、私は「門」の2つの新しいノードを作成していると、それらの間の唯一の違いはあります最初のノードには変数「1と2」が初期化されておらず、2番目のノードは初期化されています。

+4

デフォルトのコンストラクタが明示的に定義されているクラスに対して、 'new T 'と' new T() 'に違いはありません。そのコンストラクタはどちらの場合でも実行されます。 –

+0

@Josh、実際にこのコードを実行して結果を確認しましたか? – crashmstr

+0

あなたの 'some_func()'は 'Gate'オブジェクトをリークします。 – jrok

答えて

10

C++には、PODと非PODの2種類のクラスがあります(「POD」は「普通の古いデータ」...多少誤解を招くヒントです)。

非PODの場合、new Tnew T()の間には、はありません。の違いがあります。この違いは、new Tがメモリを初期化しないのに対し、new T()はデフォルトで初期化するPODにのみ影響します。

So what are PODs?すべてのビルトインC++型(intbool ...)です。

さらに、特定のユーザー定義型も同様です。 Their exact definition is somewhat complicatedしかし、ほとんどの場合、PODはカスタムコンストラクタ(他の機能と同様に)を持つことができず、すべてのデータメンバー自体がPODでなければならないと言っても過言ではありません。詳細は、リンクされたFAQの項目を参照してください。

あなたのクラスはPODではないので、両方の操作は同じです。

+0

わかりません(実際にテスト、私はここで怠惰だと感じています)この場合、PODは良い分裂です: 'struct x {int a; std :: string b; } '、私は* POD型でない' new x'と 'new x()'が違いを生むと思っています。 –

+0

@David [Nope。](http://ideone.com/s5RCk) –

+0

このテストでは私の懸念が確認されません。私は 'std :: string'が初期化されると確信していましたが、構造体のPODメンバが初期化されるかどうかはわかりませんでした。私はどちらの場合でも初期化されていないことを確認する[テスト](http://ideone.com/Xg3bW)を書いています。 - 動作が自動持続時間を持つオブジェクトのものとは異なります(関数 'f'と' g' )それは私を混乱させるものです。 –

関連する問題