c++オブジェクトのライフサイクル


C++のnew演算子とCのmalloc関数はいずれもメモリを構成するためであるが,前者は後者よりもnewがオブジェクトに必要なメモリ空間を構成するだけでなく,構造的な実行を引き起こすという利点がある.
コンストラクション(constructor)とは、オブジェクトの誕生後に最初に実行(かつ自動実行)される関数であり、その関数名は必ずカテゴリ名と同じである.
構造式に対して、オブジェクト行が破壊されるが破壊されない直前に、最後に実行(かつ自動実行)される関数であり、その関数名は必ずカテゴリ名と同じであり、最上位に~記号を付ける.
#include <iostream>
using namespace std;
class CDemo{
char name[20];
public:
    CDemo(){
    cout<<"class begin !!!"<<endl;
    }
     CDemo(char * ch)
    {
        strcpy(name,ch);
        cout << "Constructor called for " << name << '/n';
    }
    ~CDemo(){
     cout<<"desturctor called for "<<name<<endl;
    } 
};
void func()
{
 CDemo LocalObjectInFunc("LocalObjectInFunc"); // in stack 
 static CDemo StaticObject("StaticObject"); // local static 
 CDemo* pHeapObjectInFunc = new CDemo("HeapObjectInFunc"); // in heap 
 cout << "Inside func" << endl; 
} 
 CDemo GlobalObject("GlobalObject"); // global static 
int main()
 {
   CDemo LocalObjectInMain("LocalObjectInMain"); // in stack 
  CDemo* pHeapObjectInMain = new CDemo("HeapObjectInMain"); // in heap 
  cout << "In main, before calling func/n";     
  func();
  cout << "In main, after calling func/n"; 
 system("pause");
} 

上記のコードの実行結果は次のとおりです.
Constructor called for GlobalObjectConstructor called for LocalObjectInMainConstructor called for HeapObjectInMainIn main, before calling funcConstructor called for LocalObjectInFuncConstructor called for StaticObjectConstructor called for HeapObjectInFuncInside funcdesturctor called for LocalObjectInFuncIn main,after calling funcは任意のキーを押して続行してください.
以下の結論が得られます
  • 全ドメインオブジェクト(本例のGlobalObject)については、プログラムが開始されると、その構造式が先に実行される(プログラムのアクセスポイントよりも早い).プログラムが終了する前にそのプロファイルが実行されます.MFCプログラムにはこのような全域オブジェクトがあり、通常アプリケーションオブジェクトと呼ばれている.
  • 領域オブジェクトについて、オブジェクトが誕生すると、その構造式が実行される.プログラムフローがオブジェクトの生存範囲(オブジェクトが破壊されるまで)を離れると、そのプロファイルが実行されます.
  • 静的オブジェクトについて、オブジェクトが誕生するとその構造式が実行される.プログラムが終了すると(このオブジェクトは破壊される)、そのプロファイルが実行されますが、ドメイン全体のオブジェクトのプロファイルよりも一歩早く実行されます.
  • は、new方式で生成された領域オブジェクトについて、オブジェクトが誕生するとその構造式が実行される.プロファイルは、オブジェクトがdeleteされたときに実行されます(前例のプログラムは例示されていません).

  • 4つの異なるオブジェクト生存方式(in stack、in heap、global、local static)
    C++では、4つの方法で1つのオブジェクトを生成できます.
    1つ目の方法は、スタック内でそれを生成することです.
    void MyFunc(){CFOO;//スタックでfooオブジェクトを生成...}第2の方法は、堆積(heap)の中でそれを生成することです.
    void MyFunc(){...CFOo*pFoo=new CFOo();//スタック(heap)でオブジェクトを生成する}3つ目の方法は、ドメイン全体のオブジェクト(同時に静的オブジェクト)を生成することです:CFOo foo;//任意の関数の範囲外でこの操作を行います.
    4つ目の方法は、void MyFunc(){static CFOo foo;//関数範囲内の静的オブジェクトを生成することです.  }
    いずれの手法においても,C++はCFOo構造式に対する呼び出し動作を生成する.前の2つの場合、C++はメモリを構成する--スタック(stack)またはスタック(heap)--その後、すぐに非表示の(あなたの元のコードには見えない)構造呼び出しを生成します.第3の場合、オブジェクトは任意の「関数アクティビティ範囲(function scope)」の外に実装されるため、このような構造呼び出し動作を配置する場所は明らかにない.
    はい、3つ目の場合(静的全域オブジェクト)の構造呼び出し動作はstartupコードで手伝う必要があります.startupコードは何ですか?プログラムアクセスポイント(mainまたはWinMain)よりも早く実行されたコードで、C++コンパイラによって提供され、あなたのプログラムに結合されています.startupコードは、関数ライブラリの初期化、プロセス情報の設定、I/O streamの生成などの動作、staticオブジェクトの初期化動作(つまり、その構造式を呼び出す)を行うことができます.
    コンパイラがプログラムをコンパイルすると、静的オブジェクトが見つかり、シリアルに追加されます.より精巧に
    確かに、コンパイラはこの静的オブジェクトだけでなく、オブジェクトの構造式とパラメータ(もしあれば)を指すポインタも付けられています.プログラムアクセスポイント(mainまたはWinMain)に制御権を渡す前に、startupコードはこのシリアル上をすばやく移動し、すべての登録されたスキーマを呼び出し、登録されたパラメータを使用して静的オブジェクトを初期化します.
    4つ目のケース(領域静的オブジェクト)は、C言語の静的領域変数に相当し、エンティティ(instance)が1つしか生成されず、固定メモリ(stackでもheapでもない)に存在します.その構造は、制御権が最初に宣言に移動したとき(すなわち、MyFuncが最初に呼び出されたとき)に呼び出される.
     
    原文住所:http://blog.csdn.net/j_factory/article/details/3582499