Cpp クラス デストラクタ 新しいページはコチラ
提供: yonewiki
(→クラス デストラクタ) |
(→クラス デストラクタ) |
||
21行: | 21行: | ||
ポインタ変数を定義した時点、図の★の部分では、char* pcA;となっていて、図では、何もないchar型の大きさを知る穴あきの枠組プレートみたいなものが準備されます。この時点ではメモリ空間のポインタ変数がさすためのアドレス格納の旗みたいなものがあって、そこに32bitのメモリアドレスを保持できるのですが、最初は何も入ってい状態になります。旗があって枠がある。そんなイメージですね。図の中では間違えて16bitアドレスの場合と書いてますが、32byteが正しいです。そうするとアドレス範囲は0x00000000~0xffffffffで、この範囲の値が入る予定です。このアドレスを格納するアドレスだけは宣言した時点で決まります。それが図の例だと0x000100a0だとしています。これは &pcAとして取得できるモノです。実際には取得することはしないはずです。ポインタ変数にアドレス演算子を接頭句につけて使うことは、まずないでしょう。総じていうと、この時点でのpcAという変数は役立たずといってよいでしょう。変数を入れる領域についてのうつわ、箱、受け皿、そういったものすら用意できていないのです。変数を使うための準備はしたっていう感じです。指し示すことができるのは1byteの領域で基本charという型を指すことができて、そのアドレスを受け入れる器だけは準備した状態です。中身はまだない。吾輩は猫である名前はまだない。そんな感じです。 | ポインタ変数を定義した時点、図の★の部分では、char* pcA;となっていて、図では、何もないchar型の大きさを知る穴あきの枠組プレートみたいなものが準備されます。この時点ではメモリ空間のポインタ変数がさすためのアドレス格納の旗みたいなものがあって、そこに32bitのメモリアドレスを保持できるのですが、最初は何も入ってい状態になります。旗があって枠がある。そんなイメージですね。図の中では間違えて16bitアドレスの場合と書いてますが、32byteが正しいです。そうするとアドレス範囲は0x00000000~0xffffffffで、この範囲の値が入る予定です。このアドレスを格納するアドレスだけは宣言した時点で決まります。それが図の例だと0x000100a0だとしています。これは &pcAとして取得できるモノです。実際には取得することはしないはずです。ポインタ変数にアドレス演算子を接頭句につけて使うことは、まずないでしょう。総じていうと、この時点でのpcAという変数は役立たずといってよいでしょう。変数を入れる領域についてのうつわ、箱、受け皿、そういったものすら用意できていないのです。変数を使うための準備はしたっていう感じです。指し示すことができるのは1byteの領域で基本charという型を指すことができて、そのアドレスを受け入れる器だけは準備した状態です。中身はまだない。吾輩は猫である名前はまだない。そんな感じです。 | ||
− | + | ||
ここまで、ポインタ変数を定義したときの動作を説明しましたが、通常、この次に起こることは既存のchar変数にポインタを合わせるchar cA_test;→pcA = &cA_test;という処理、あるいはnew演算子を使うことでしょう。 | ここまで、ポインタ変数を定義したときの動作を説明しましたが、通常、この次に起こることは既存のchar変数にポインタを合わせるchar cA_test;→pcA = &cA_test;という処理、あるいはnew演算子を使うことでしょう。 | ||
− | + | new演算子を使った場合は図のとおり、pcA = new char; と記述する処理を行います。これが、上向き矢印のところに書いた通り<span style = "background:linear-gradient(transparent 50%, #ff7f7f 50%); font-weight:bold; ">実体化</span>というモノにあたります。そうすると、またたくまに実際のメモリ空間に作用する処理が行われ、図の例の場合は1byte<span>(</span>8bit<span>)</span>のメモリ領域を確保し、確保した場所のアドレス0x0000ffa0がpcAに格納されます。図で言うと旗の部分です。旗の部分は実際のメモリ空間を使っていますから、どこか遠くのメモリ空間の先頭、この図の例では0x000100a0を先頭にここから32byteのところまでを使って、今回使うchar型アドレス pcA の0x0000ffa0が格納されます。メモリ空間の大きい値のところから手前に向かって32bitの値が格納される方式をWindowsでは扱っているため、図のようにひっくり返ったような感じで設定されます。これを<span style = "background:linear-gradient(transparent 50%, #ff7f7f 50%); font-weight:bold; ">リトルエンディアン方式</span>と言います。 | |
40行: | 40行: | ||
− | + | 動的なメモリ確保をした場合は、そのままプログラムが異常終了したら、確保しっ放しでプログラムがほったらかし状態にして、他のプログラムも使えない領域として、どのプログラムからも手を付けることができな状態になってしまいます。これを<span style = "background:linear-gradient(transparent 50%, #ff7f7f 50%); font-weight:bold; ">メモリリーク</span>と呼んでいます。PCを再起動するまではメモリがスッキリしないことになります。メモリは揮発性のものが現在は主流なので、一度PCの電源を落とせば、きれいさっぱり、解放されます。 | |
46行: | 46行: | ||
− | そこでメモリを解放するにはdelete pcA のようにして、ポインタ変数を役立たずの状態にするということが大事になります。 | + | そこでメモリを解放するにはdelete pcA;のようにして、ポインタ変数を役立たずの状態にするということが大事になります。 |
64行: | 64行: | ||
#include "test.h"; | #include "test.h"; | ||
void Ctest::Ctest(int iArraySize){ | void Ctest::Ctest(int iArraySize){ | ||
− | piValue = | + | piValue = new int[iArraySize]; |
} | } | ||
void Ctest::~Ctest(){ | void Ctest::~Ctest(){ | ||
− | + | delete piValue; | |
} | } | ||
76行: | 76行: | ||
int main(){ | int main(){ | ||
Ctest *pCtest; | Ctest *pCtest; | ||
− | pCtest = | + | pCtest = new Ctest(10); |
////////// | ////////// | ||
82行: | 82行: | ||
////////// | ////////// | ||
− | + | delete pCtest; | |
return True; | return True; | ||
} | } | ||
</syntaxhighlight2> | </syntaxhighlight2> | ||
− | |||
== '''5行目''' == | == '''5行目''' == |