ページ

2015年3月15日日曜日

生のポインタを扱うときの注意点(C++)

最近、Cocos2d-x v3.x を触っており、主にこの本で勉強しています。

cocos2d-xではじめるスマートフォンゲーム開発 [cocos2d-x Ver.3対応] for iOS/Android
三木 康暉
技術評論社
売り上げランキング: 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 件のコメント:

コメントを投稿