STLで想定されるC++表示呼び出し構造関数
1226 ワード
STLのコンテナの構造関数では、destroy()という関数が頻繁に呼び出されます.
STLでdestroy()がリロードされた点はここで議論しないでここで最も簡単なバージョンを貼ります
template
inline void destory(T * pointer)
{
pointer->~T();
}
ここではポインタによって構造関数が呼び出されます.C++表示構造関数はどのようにプロセスを実行しますか?
2点検討:1)ポインタまたは参照2)値を通す
aにとっては確かに構造関数が呼び出されたが,プログラム終了時に構造関数が再び呼び出された.
上の置換をa(ここでは貼らない)に置き換えると,最後のプログラム終了時にbが指すオブジェクトは構造関数を再呼び出さないが,bによってクラス内の値にアクセスできる.【もちろんここにdelete bがないとメモリ漏れが発生します】
ここでは、オブジェクト値によって構造関数を呼び出すと、スタックからコンテンツが破棄されないため、オブジェクトが存在することを示します.
同じように、コンストラクション関数を呼び出してもオブジェクトを再作成することはありません.また、メモリの漏洩も発生する可能性があります.
STLでdestroy()がリロードされた点はここで議論しないでここで最も簡単なバージョンを貼ります
template
inline void destory(T * pointer)
{
pointer->~T();
}
ここではポインタによって構造関数が呼び出されます.C++表示構造関数はどのようにプロセスを実行しますか?
2点検討:1)ポインタまたは参照2)値を通す
#include <iostream>
using namespace std;
class A
{
public:
A():a(2),b(3),c(4)
{}
~A()
{
cout<<" "<<endl;
}
int GETA()
{
return a;
}
private:
int a;
int b;
int c;
};
int main(int argv,char* argc[])
{
A a;
//
a.~A();
cout<<"********************"<<endl;
// A *b=new A();
// b->~A();
cout<<"*******************"<<endl;
cout<<a.GETA()<<endl;
// cout<<b->GETA()<<endl;
cout<<" "<<endl;
}
aにとっては確かに構造関数が呼び出されたが,プログラム終了時に構造関数が再び呼び出された.
上の置換をa(ここでは貼らない)に置き換えると,最後のプログラム終了時にbが指すオブジェクトは構造関数を再呼び出さないが,bによってクラス内の値にアクセスできる.【もちろんここにdelete bがないとメモリ漏れが発生します】
ここでは、オブジェクト値によって構造関数を呼び出すと、スタックからコンテンツが破棄されないため、オブジェクトが存在することを示します.
同じように、コンストラクション関数を呼び出してもオブジェクトを再作成することはありません.また、メモリの漏洩も発生する可能性があります.