最近、Cocos2d-x v3.x を触っており、主にこの本で勉強しています。
ただ、当然C++の知識は必要になるわけで。
C++は以前に少し使っていたことがあるのですが、期間が短かったためもはや忘却の彼方…。
Cocos2d-xにはメモリ管理の方法が用意されているようなのですが、
それについて理解するために、まずは通常のメモリ管理についておさらいしたのでメモ。
生のポインタを扱うときは、メモリの管理に気をつけないと以下の様な問題が発生します。
三木 康暉
技術評論社
売り上げランキング: 49,182
技術評論社
売り上げランキング: 49,182
ただ、当然C++の知識は必要になるわけで。
C++は以前に少し使っていたことがあるのですが、期間が短かったためもはや忘却の彼方…。
Cocos2d-xにはメモリ管理の方法が用意されているようなのですが、
それについて理解するために、まずは通常のメモリ管理についておさらいしたのでメモ。
生のポインタを扱うときは、メモリの管理に気をつけないと以下の様な問題が発生します。
メモリリーク(memory leak)
プログラムが確保したメモリの一部、または全部を解放するのを忘れ、確保したままになってしまうこと。
Object *obj = new Object();
obj = nullptr;
上記の例では、実体のアドレスを参照する方法がなくなり、メモリが解放できません。
ダングリング・ポインタ(dangling pointer)
プログラムの実行中にポインタが不正なメモリ領域を指している状態。
ポインタが宙ぶらりんな状態(dangling)であることから、ダングリング・ポインタと呼ばれます。
Object *obj = new Object();
delete obj;
obj->someMethod();
上記の例では、解放した領域を参照してしまっています。
Object *obj = new Object();
delete obj;
delete obj;
上記の例では、一度解放した領域をもう一度解放しようとしています。
まとめ
これらの問題を防ぐには、以下を徹底する必要があります。
- 確保したメモリが不要になったらdeleteする
- 解放したメモリを参照している変数にnullptrを設定する
こういったことを忘れずに行えるように、C++11ではstd::shared_ptrなどを使うのだと思いますが、それについてはまたそのうち調べよう。
0 件のコメント:
コメントを投稿