new
/delete
とmalloc
/を使用して同じ効果を得たいため、コンストラクターの初期化リストを使用する必要のないクラスの例を作成しました (学習目的のみ) free
。コンストラクターの初期化リストを使用しない以外の制約は何ですか? 次のコードは、新規作成/削除の動作を正しくシミュレートしていると思いますか?
#include <iostream>
using namespace std;
class X
{
private:
int* a;
public:
X(int x)
{
this->a = new int;
*(this->a) = x;
}
~X() { delete this->a; }
int getA() { return *(this->a); }
};
class Y
{
private:
int* a;
public:
void CTor(int x)
{
this->a = new int;
*(this->a) = x;
}
void DTor() { delete this->a; }
int getA(){ return *(this->a); }
};
void main()
{
X *xP = new X(44);
cout<<xP->getA()<<endl;
delete xP;
Y *yP = static_cast<Y*>(malloc(sizeof(Y)));
yP->CTor(44);
cout<<yP->getA()<<endl;
yP->DTor();
free(yP);
system("pause");
}
を使用しないdelete xP
と、プログラムの終了時にデストラクタが自動的に呼び出されますが、フリー ストアは解放されません (つまりxP
、 のフリー ストア、フィールドのフリー ストアはa
解放されます)。デストラクタを使用するdelete xP
と、呼び出された後、フリー ストアが完全に解放されます。私が間違っている場合は、私を修正してください。