##はじめに
C++を1年前くらいから扱うようになりましたが、いまだにポインタとかメモリとかあやふやです。。。
初めてqiitaに書き込みます。
なので、書き方や言い回しなどもしかしたら酷いものかもしれません・・・
しかし同じような悩みを抱えている人がいれば!!
##本題
今日も仕事で遭遇したメモリ関連に関して記事にします。
どうやら、クラス変数を普通に宣言する場合と、ポインタとして宣言する場合でメモリが割り当てられたり割り当てられなかったりするみたいです。
下記がソースです。
class CTest
{
public:
CTest() { m_no = 0; };
~CTest() {};
public:
int m_no;
};
int main()
{
//クラスを変数で宣言
CTest test;
printf("testに割り振られたアドレス:%p\n", &test);
test.m_no = 0; //【死なない!!】 アドレスあるからか!?
//クラスをポインタ変数として宣言
CTest* pTest = NULL;
printf("pTestに割り振られたアドレス:%p\n", pTest);
pTest->m_no = 0; //【死ぬ!!】 アドレスないものに突っ込もうとするからか!?
return 0;
}
ソースの中の【死ぬ!!】のところで落ちましたよね。。。
ここらへんが自分でも最初は理解できず。。。
コンソールには、下記のような結果が表示されていると思います。
testに割り振られたアドレス:00BAFA0C
pTestに割り振られたアドレス:00000000
要するに、pTestにはアドレスが割り振られているようで振られていません!
アドレスの存在しないpTestに、pTest->m_noでアクセスしようとしたせいで死んだようです。
なのでポインタに、インスタンス化された変数をあげればうまくいきます。
下記参照
class CTest
{
public:
CTest() { m_no = 0; };
~CTest() {};
public:
int m_no;
};
int main()
{
//クラスを変数で宣言
CTest test;
printf("testに割り振られたアドレス:%p\n", &test);
test.m_no = 0; //【死なない!!】 アドレスあるからか!?
//クラスをポインタ変数として宣言
CTest* pTest = NULL;
//↓↓↓↓↓↓ここが追加した部分↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓
pTest = &test;
//↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑
printf("pTestに割り振られたアドレス:%p\n", pTest);
pTest->m_no = 0; //【死なない!!】 アドレスが割り振られたから!!
return 0;
}
文章すごくわかりにくいかもしれません。
ポインタ・メモリに1年振れて思うのは、難しいけど面白い!!です。
それではまた記事書きたいと思います。