2017-05-15 2 views
-7

私はいくつか質問があり、私は助けてくれるでしょう。C++ - オブジェクトと新しいメモリの割り当て、何が起こっているのかの説明

プリミティブ型の関数のみのパターンを作成できますか?

setters \ gettersは、プログラマが明示的に定義していない場合、二重に設定されますか?

class CreateDestroy { 
public: 
    CreateDestroy() { cout << "create "; } 
    ~CreateDestroy() { cout << "destroy "; } 
}; 

int main() { 
    CreateDestroy* c1; 
    for (int i = 1; i <= 2; i++) 
    CreateDestroy c2; 
    return 0; 
} 

メインでCreateDestroy * c1を作成すると、print createですか?プログラムの終わりにプリントが破壊されますか?

create create destroy create destroy 

と私は(*なし)メインでCreateDestroy c1;を持っている場合は、印刷を変更していますか? または私が持っている場合CreateDestroy* c1 = new CreateDestroy;プリントを変更しますか?

私はdelete c1を呼び出します。主に:

int main() { 
    CreateDestroy* c1 = new CreateDestroy; 
    for (int i = 1; i <= 2; i++) 
    CreateDestroy c2; 
    delete c1; // ! 
    return 0; 
} 

私は削除を呼び出すと印刷されますか? これは、私が印刷をしなかったことを削除するよう呼びかけなかったことを意味しますか?

私はより良い

感謝のそれを理解するために、説明させていただきます。

+0

'プリミティブ型に対してのみ関数のパターンを作成できますか? 'この文はわかりません。私はパターンの別の理解を持っていると思います –

+2

質問ごとに1つ質問してください。把握すべきことがたくさんあるようですので、あなたの質問を例文とあなたが提供できる追加情報でサポートしてください。 –

+0

出力シーケンス "create create destroy create destroy"は元のコードとは関係ありません。 'CreateDestroy * c1'をポインタとして使用すると、ここでは何もインスタンス化されず、' c2'のために 'create destroy create destroy'を取得する必要があります。 'c1'がポインタ' CreateDestroy c1'でない場合、 'create create destroy create destroy destroy'を取得する必要があります。 'new/delete'と' c1'をポインタとしてインスタンス化すると、後者の出力シーケンスにもつながります。 – cwschmidt

答えて

1

私は、主な問題は、しっかりscopeの概念と接続し、ダイナミックstorage durationから自動区別されると思う:

自動記憶域期間。オブジェクトは、囲みコードブロックの先頭に割り当てられた であり、末尾には が割り当て解除されます。 がstatic、externまたはthread_localと宣言されているものを除き、すべてのローカルオブジェクトにはこの保存期間があります。

動的保存期間。 オブジェクトは、動的な メモリ割り当て関数を使用して、要求ごとに割り当てられ、割り当て解除されます。 CreateDestroy* c1について

、あなたは(それがこのタイプのオブジェクトは、後に設置される場合のメモリアドレスを保持するだけの価値だ)、それ自体でタイプCreateDestroyのオブジェクトを作成しない、ポインタ型の変数を定義。したがって、このポインタ変数を宣言するだけでは、CreateDestroyオブジェクトが作成または破棄されないので、コンストラクタまたはデストラクタは呼び出されません。ただし、c1 = new CreateDestroy()と記述すると、新しいオブジェクトが作成され、この時点でコンストラクタが正確に呼び出されます。その方法で作成されたオブジェクトには動的な保存期間があります。つまり、delete c1を明示的に呼び出すまで「生き続ける」でしょう。デストラクタは、delete c1を呼び出した場合にのみ呼び出されます。

for -loopブロック内で宣言されたCreateDestroy c2に関しては、オブジェクトは、forループ内のブロックのスコープに接続されたautomatic storage durationを持っています。実行時には、各反復はブロックの独自のインスタンスを表し、ブロックスコープで宣言されたオブジェクトはすべての反復で(宣言の時点で、コンストラクタをトリガして)作成され、各反復(ブロックの終わりに、デストラクタをトリガする)。

少し助けてくれることを願っています。

+0

'c1'がオブジェクトです。あなたは' CreateDestroy'型のオブジェクトがありません。 –

+0

@MM:youそうです。 「対象」の概念はかなり広い。 –

関連する問題